我正在使用lisp中的TCP客户端,并且无法正确读取/打印套接字流。当客户端向服务器发送数据时,它应该收到响应,我需要将其写入stdout。这可以正常工作,除了我遇到响应打印两次的问题。如果我发送了多个命令,则只打印最后一个命令。这是我的代码:
(defun socket-print (string socket)
(write-line string (usocket:socket-stream socket))
(force-output (usocket:socket-stream socket)))
(defun socket-read (socket)
(write-line (read-line (usocket:socket-stream socket) nil)))
(defun mytest (command)
(let ((socket (usocket:socket-connect _IP_ _PORT_)))
(socket-print command socket)
(socket-read socket)))
答案 0 :(得分:3)
我不认为它打印两次。我认为它是打印(通过写入行)一次,然后写入行 返回行, REPL 正在打印返回值。例如,如果您修改 mytest 以返回 nil ,我认为您会看到您期望的输出:
(defun mytest (command)
(let ((socket (usocket:socket-connect _IP_ _PORT_)))
(socket-print command socket)
(socket-read socket)
nil))
这应该打印 写入行的行,然后返回 nil ,REPL将打印 nil 。与此相比:
CL-USER> (defun echo (line)
(write-line line))
ECHO
CL-USER> (echo "hello")
hello
"hello"
CL-USER> (progn
(echo "hello")
(echo "world"))
hello
world
"world"
CL-USER> (progn
(echo "hello")
(echo "world")
nil)
hello
world
NIL
CL-USER> (progn
(echo "hello")
(echo "world")
(values))
hello
world
; No value
另见: