2015-02-05 12 views
3

Я работаю над клиентом TCP в lisp, и у меня возникают трудности с чтением/печатью потока сокетов правильно. Когда клиент отправляет данные на сервер, он должен получить ответ, и мне нужно записать его в стандартный вывод. Это работает правильно, за исключением того, что у меня проблема, когда ответ печатает дважды. Если у меня будет отправлено несколько команд, будет напечатано только последнее. Вот мой код:Read-line from socket-stream in lisp

(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

Я не думаю, что это печать дважды. Я думаю, что это печать (через записи строки) один раз, а затем записи строки является возвращение линии, а РЕПЛ печатает возвращаемое значение. Например, если вы измените ваш MyTest вернуть ноль, я думаю, вы увидите результат, который вы ожидаете:

(defun mytest (command) 
    (let ((socket (usocket:socket-connect _IP_ _PORT_))) 
     (socket-print command socket) 
     (socket-read socket) 
     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 

Также см:

+0

Это именно то, что мне было нужно, Благодарю. – unbootabru