2017-01-08 6 views
0

だから私は中socket.sendPython36とソケット

経由でログを私の変数を渡すことによって、Iにログインsocket.connec

を使用してIRCチャットに接続してるが成功した後、私はしばらくの間に座っています本当のループを使用して Socket.recv(1024)

私はちょうど応答をすべて印刷しているようだが、私は文字列の最後に追加したいと言ってみましょう...私は気づいたsocket.recvは完全なメッセージを常に得る(期待どおりに1024までしか取得できない)。メッセージの残りはループの次の反復にある。

これは、フィードバックを行単位で処理することができなくなります。

トランケートされていないデータを常に読み取るには、より良い方法がありますか?応答を受け取る前に応答のサイズを調べて、バッファを動的に設定できるかどうか

答えて

0

TCPはストリームベースのプロトコルです。受信したバイトをバッファリングし、ストリームから完全なメッセージのみを抽出します。

完全な行については、バッファ内の改行文字を探します。

例サーバー:

import socket 

class Client: 

    def __init__(self,socket): 
     self.socket = socket 
     self.buffer = b'' 

    def getline(self): 
     # if there is no complete line in buffer, 
     # add to buffer until there is one. 
     while b'\n' not in self.buffer: 
      data = self.socket.recv(1024) 
      if not data: 
       # socket was closed 
       return '' 
      self.buffer += data 

     # break the buffer on the first newline. 
     # note: partition(n) return "left of n","n","right of n" 
     line,newline,self.buffer = self.buffer.partition(b'\n') 
     return line + newline 

srv = socket.socket() 
srv.bind(('',5000)) 
srv.listen(1) 
conn,where = srv.accept() 
client = Client(conn) 
print(f'Client connected on {where}') 
while True: 
    line = client.getline() 
    if not line: 
     break 
    print(line) 

例クライアント:サーバー上の

s=socket() 
s.connect(('127.0.0.1',5000)) 
s.sendall(b'line one\nline two\nline three\nincomplete') 
s.close() 

出力:

Client connected on ('127.0.0.1', 2667) 
b'line one\n' 
b'line two\n' 
b'line three\n' 
+0

はそれがで終わる\ nまたはで終わるかどうかを確認するために、それぞれの行をチェックしようとしました\ rで終わるか、\ r \ nで終わっていますが、行はありません。完全なもの。 utf-8のデコード前後のチェックを試みました。私の.splitlines()メソッドが改行文字を殺しているのだろうか? –

+0

@AntonioAnonymousはい、 '.splitlines()'は改行を削除します。改行があるまでバッファリングしてからバッファを処理する必要があります。私は例を使って更新します。 –