그냥 소켓에 직렬화 된 데이터를 작성하지 마십시오. 먼저 직렬화 된 객체의 길이를 포함하는 고정 크기 필드를 보냅니다.
송신 측
은 대략 다음과 같습니다
socket.write(struct.pack("H", len(data)) #send a two-byte size field
socket.write(data)
그리고 recv'ing 측과 같이된다 : 이것은 소켓 프로그래밍에 대한 일반적인 디자인 패턴입니다
dataToRead = struct.unpack("H", socket.read(2))[0]
data = socket.read(dataToRead)
합니다. 당신처럼 보이는 회선을 통한 메시지 형식으로 끝낼
type = socket.read(1) # get the type of msg
dataToRead = struct.unpack("H", socket.read(2))[0] # get the len of the msg
data = socket.read(dataToRead) # read the msg
if TYPE_FOO == type:
handleFoo(data)
elif TYPE_BAR == type:
handleBar(data)
else:
raise UnknownTypeException(type)
: 당신의 수신 측이 무언가 같이가되도록 대부분의 디자인뿐만 아니라 타입 필드를 포함하는 오버 - 더 - 와이어 구조를 확장
struct {
unsigned char type;
unsigned short length;
void *data;
}
예기치 않은 요구 사항에 대해 와이어 프로토콜을 미래에 대비할 수있는 적절한 작업을 수행합니다. 이것은 Type-Length-Value 프로토콜로, 네트워크 프로토콜에서 반복해서 찾을 수 있습니다.
+1. 고맙습니다!! – jathanism
'struct.pack ("H", len (data))'을 사용하면 중요한 결과가 발생합니다 : 데이터는 65536 바이트 이하 여야합니다. 'Q'(최대 크기 = 18000 페타 바이트) 대신 '부호없는 long long'을 사용하여 데이터의 최대 허용 크기를 늘릴 수 있습니다. – Flimm