2015-02-05 22 views
3

我正在使用lisp中的TCP客户端,并且无法正确读取/打印套接字流。当客户端发送数据到服务器时,它应该收到响应,并且我需要将它写入stdout。这工作正常,除了我有一个问题,其中响应打印两次。如果我发送了多个命令,则只打印最后一个命令两次。这里是我的代码:从lisp的socket-stream读取线

(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))) 

回答

3

我不认为它打印两次。我认为这是打印(通过写入线)一次,然后写入线返回线,和REPL正在打印的返回值。例如,如果您修改mytest的返回,我想你会看到在输出你期待:

(defun mytest (command) 
    (let ((socket (usocket:socket-connect _IP_ _PORT_))) 
     (socket-print command socket) 
     (socket-read socket) 
     nil)) 

这应该打印写入线行,然后返回,并且REPL将打印

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 

另请参阅:与比较这

+0

这正是我所需要的,谢谢。 – unbootabru 2015-02-05 21:46:18