2016-03-30 9 views
0

私はコマンドを聞いて応答するソケットサーバーを持っています。応答は必ずしも同じ長さではない。 Pythonでは、サーバーからの応答が1024バイトより小さい場合でも、次のコードはうまく動作します。ルアソケットは長さが不明な文字列を受け取ります

import socket 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock.connect(("localhost", 9999)) 
sock.sendall(bytes("command\n", 'utf-8')) 
print(sock.recv(1024)) 

これを同等のルアコードに翻訳します。これは私の試みです:

socket = require("socket") 
sock = socket.connect("localhost", 9999) 
sock:send("command\n") 
s, status, partial = sock:receive(1024) 
print(s) 

残念ながら、1024バイト未満の場合、受信コールはブロックされます。 Pythonクライアントは、伝送が終了していることと、なぜluaクライアントがまだ待機しているのかを知る方法はありますか?

答えて

1

Luaの受信はブロックされていますが、少なくとも1バイトがあれば非ブロック化されます。基礎となるtcpプロトコルは、1バイト以上の読取りを保証しません。だから、あなたはPythonで全体の応答を受け取った場合、幸いです。一方、Luaは正確に1024バイトを要求し、サーバが1024を送信するかソケットが閉じられるまで待機します。

TCPはストリーミングプロトコルです。あなたは長さインジケータやメッセージ終わりのマークが必要です。例えば、改行のように、luaで書くことができます:

s = sock:receive('*l') 
+0

つまり、私はサーバーの応答を変更する必要がありますか? – KrawallKurt

+0

はい、実際のプロトコルを実装する必要があります。 – Daniel

関連する問題