2016-12-15 95 views
1

在一個CCL REPL我進入:如何通過Clozure Common Lisp中的套接字進行通信?

(WITH-OPEN-SOCKET (socket :LOCAL-PORT 6667 
          :LOCAL-HOST "localhost" 
          :CONNECT :PASSIVE 
          :REUSE-ADDRESS t) 
    (let ((stream (ACCEPT-CONNECTION socket :wait t))) 
    (format stream "hello from server.~%"))) 

它等待連接。

在另一個CCL過程中,我輸入:

(WITH-OPEN-SOCKET (socket-stream :REMOTE-PORT 6667 
           :REMOTE-HOST "localhost" 
           :CONNECT :ACTIVE 
           :REUSE-ADDRESS t) 
    (format t (READ-LINE socket-stream))) 

此時這一過程進入等待。它既不從服務器讀取,也不退出。

但是,客戶端連接到服務器的那一刻,服務器將以NIL退出。顯然至少建立了一個連接,但字符串「來自服務器的Hello」。從未得到溝通。

我確定這是我忽略的一些基本內容。我如何發送消息? READ-LINE不是從流中讀取數據的正確方法嗎?我是否從服務器寫錯了?我將如何建立一個雙向簡單的基於字符串的通信?

+0

還有':format:text'選項(http://stackoverflow.com/a/1526444/124319),不知道這是否有幫助。 – coredump

+1

@coredump格式的默認值是根據CCL文檔的文本。所以這是不需要的。但是,謝謝。 –

回答

7

你知道輸出可以被緩衝嗎?

這是一個典型的問題。見FINISH-OUTPUT and FORCE-OUTPUT

如果您寫入緩衝流,則必須確保緩衝輸出實際完全交付。

? (WITH-OPEN-SOCKET (socket-stream :REMOTE-PORT 6667 
           :REMOTE-HOST "localhost" 
           :CONNECT :ACTIVE 
           :REUSE-ADDRESS t) 
    (format t (READ-LINE socket-stream))) 
hello from server. 
NIL 


--- 

? (WITH-OPEN-SOCKET (socket :LOCAL-PORT 6667 
          :LOCAL-HOST "localhost" 
          :CONNECT :PASSIVE 
          :REUSE-ADDRESS t) 
    (let ((stream (ACCEPT-CONNECTION socket :wait t))) 
    (format stream "hello from server.~%") 
    (finish-output stream) 
    stream)) 
#<BASIC-TCP-STREAM ISO-8859-1 (SOCKET/21) #x302000E3FD9D> 
+0

謝謝。我檢查了鏈接,並在格式調用後添加(FINISH-OUTPUT)到最後。沒有區別。行爲完全一樣。也許這不是緩衝這是問題? –

+0

@λ-:你打電話給'finish-output'的是哪一個流?你有沒有正確的流向FINISH-OUTPUT? –

+0

是的。而已。我很慵懶地閱讀文檔。 –

相關問題