Это не так, как работают сокеты. Входят байты и выходят байты, но должен быть какой-то другой механизм, чтобы сказать вам, насколько велико сообщение. Если вы отправите 50 байтов, затем еще 75 байтов, затем 20 байтов на одном конце сокета и затем вызовите recv (100), вы можете получить от 1 до 100 байтов из блокирующего сокета. Вы несете ответственность за буферизацию recv, пока не получите полное сообщение, и вам необходимо определить, что такое полное сообщение. Некоторые варианты:
- Отправка сообщений фиксированной длины.
- Отправьте фиксированное количество байтов, представляющих длину сообщения, затем сообщение.
- Разделяйте сообщения с помощью сторожевого байта.
Вот пример класса для буферизации полученных данных с использованием байта стража:
import socket
class Client(object):
def __init__(self):
self.buffer = ''
self.sock = None
def connect(self,address):
self.buffer = ''
self.sock = socket.socket()
self.sock.connect(address)
def get_msg(self):
'''Append raw data to buffer until sentinel is found,
then strip off the message, leaving the remainder
in the buffer.
'''
while not '\n' in self.buffer:
data = self.sock.recv(4096)
if not data:
return ''
self.buffer += data
sentinel = self.buffer.index('\n') + 1
msg,self.buffer = self.buffer[:sentinel],self.buffer[sentinel:]
return msg
def close(self):
self.sock.close()
if __name__ == '__main__':
c = Client()
c.connect((HOST,PORT))
while True:
msg = c.get_msg()
if not msg:
break
print repr(msg)
c.close()