lisp和python程序在socket上通信的时间问题

2024-09-28 21:04:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用python程序和Allegro通用Lisp程序通过套接字进行通信。现在,我尝试设置一个Lisp服务器来监听连接,让python客户机连接到服务器,然后从客户机向服务器发送一条简单的消息。Lisp服务器如下所示:

(let ((socket (socket:make-socket :connect :passive
                              :type :stream
                              :address-family :internet
                              :local-port 45676)))
  (format t "opened up socket ~A for connections~%" socket)

  ;; now wait for connections and accept
  (let ((client (socket:accept-connection socket 
                                      :wait t)))
    (when client
      ;; we've got a new connection from client
      (format t "got a new connection from ~A~%" client)

      ;; now wait for data from client
      (loop until (listen client) do
        (format t "first character seen is ~A~%" (peek-char t client))
        (let ((data (read-line client)))
          (format t "data received: ~A~%" data))))))

python客户端如下所示:

^{pr2}$

因为我想让多个消息通过这个流,所以我监听传入的数据 然后回显服务器端。然而,当我用这个命令运行时,我注意到了这个问题。输出结果如下:

opened up socket #<MULTIVALENT stream socket waiting for connection
                   at */45676 @ #x207b0cd2> for connections
got a new connection from #<MULTIVALENT stream socket connected from
                            localhost/45676 to localhost/60582 @
                            #x207b34f2>

换句话说,它实际上并没有回显数据(在我的例子中,“(list A B)”)。如果我取消了sleep命令的注释(在连接启动和数据发送之间引入一些延迟),输出如下所示:

opened up socket #<MULTIVALENT stream socket waiting for connection
                   at */45676 @ #x207b0bea> for connections
got a new connection from #<MULTIVALENT stream socket connected from
                            localhost/45676 to localhost/60572 @
                            #x207b340a>
data received: (list A B)

我不知道为什么会这样。有人能解决这个问题吗?重复使用同一个套接字连接进行多次数据交换是不是一个坏主意?如果我删除了整个循环宏调用(从而使它成为一次交换),则接收到的数据不会有任何问题,并且会正确地回显

编辑1:即使sleep命令被注释,最后一条语句也是正确的。在


Tags: 数据fromclientformatlocalhostnewfordata