如何在 Clozure Common Lisp 中通过套接字进行通信?
How to communicate over sockets in Clozure Common Lisp?
我在一个 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 不是从流中读取的正确方法吗?我从服务器写错了吗?我将如何建立基于双向简单字符串的通信?
你知道输出可以被缓冲吗?
这是一个典型的问题。参见 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>
我在一个 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 不是从流中读取的正确方法吗?我从服务器写错了吗?我将如何建立基于双向简单字符串的通信?
你知道输出可以被缓冲吗?
这是一个典型的问题。参见 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>