2016-12-15 78 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

是的。而已。我很慵懒地阅读文档。 –

相关问题