1

Python プログラムと Allegro Common 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 クライアントは次のようになります。

import socket
import time
s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
s.connect (('', 45676))
time.sleep (1) # works if uncommented, does not work if commented
s.sendall ("(list A B)")
s.close ()

複数のメッセージがこのストリームを通過するようにしたいので、サーバー側で着信データをリッスンし、それをエコーし​​ます。しかし、sleep コマンドをコメントにして実行したところ、問題に気付きました。出力は次のようになります。

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 AB)")。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回限りの交換になります)、データは問題なく受信され、適切にエコーされます

編集 1: sleep コマンドがコメントされていても、最後のステートメントは true です。

4

0 に答える 0