【问题标题】:Read-line from socket-stream in lisp从 lisp 中的套接字流读取行
【发布时间】:2015-02-05 20:31:30
【问题描述】:

我正在使用 lisp 开发 TCP 客户端,但在正确读取/打印套接字流时遇到了困难。当客户端向服务器发送数据时,它应该会收到响应,我需要将其写入标准输出。这可以正常工作,除了我遇到响应打印两次的问题。如果我有多个命令被发送,只有最后一个会被打印两次。这是我的代码:

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

【问题讨论】:

    标签: sockets tcp lisp common-lisp usocket


    【解决方案1】:

    我认为它不会打印两次。我认为它是 printing (通过 write-line)一次,然后 write-linereturning 行, REPL 正在打印返回值。例如,如果你修改你的 mytest 以返回 nil,我想你会看到你期望的输出:

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

    这应该打印带有write-line的行,然后返回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
    

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-11
      • 2020-10-20
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 2015-08-29
      相关资源
      最近更新 更多