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'
はそれがで終わる\ nまたはで終わるかどうかを確認するために、それぞれの行をチェックしようとしました\ rで終わるか、\ r \ nで終わっていますが、行はありません。完全なもの。 utf-8のデコード前後のチェックを試みました。私の.splitlines()メソッドが改行文字を殺しているのだろうか? –
@AntonioAnonymousはい、 '.splitlines()'は改行を削除します。改行があるまでバッファリングしてからバッファを処理する必要があります。私は例を使って更新します。 –