在lisp中从socket-stream读取行

时间:2015-02-05 20:31:31

标签: sockets tcp lisp common-lisp usocket

我正在使用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)))

1 个答案:

答案 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

另见: