ˆᵛˆ*_*ˆᵛˆ 1 sockets common-lisp buffered ccl
在一个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.~%")))
Run Code Online (Sandbox Code Playgroud)
它等待连接.
在另一个CCL流程中,我输入:
(WITH-OPEN-SOCKET (socket-stream :REMOTE-PORT 6667
:REMOTE-HOST "localhost"
:CONNECT :ACTIVE
:REUSE-ADDRESS t)
(format t (READ-LINE socket-stream)))
Run Code Online (Sandbox Code Playgroud)
此时此过程进入等待状态.它既不从服务器读取也不退出.
但是,当客户端连接到服务器时,服务器将以NIL退出.很明显,至少建立了一个连接,但字符串"Hello from server".永远不会沟通.
我相信这是我忽略的基本内容.如何发送消息?READ-LINE不是从流中读取的正确方法吗?我从服务器上写错了吗?如何建立基于双向简单字符串的通信?
你知道输出可以缓冲吗?
这是一个典型的问题.请参阅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>
Run Code Online (Sandbox Code Playgroud)