1

在一个 CCL REPL 中,我输入:

(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 from server”。永远不会被沟通。

我确信这是我忽略的基本内容。我如何发送消息?READ-LINE 不是从流中读取的正确方法吗?我是否从服务器错误地写入?我将如何建立一个基于简单字符串的双向通信?

4

1 回答 1

7

你知道输出可以被缓冲吗?

这是一个典型的问题。见FINISH-OUTPUT 和 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>
于 2016-12-15T16:10:33.500 回答