シリアル化されたデータをソケットに書き込むだけではいけません。最初に、シリアライズされたオブジェクトの長さを含む固定サイズのフィールドを送信します。
送信側は大まかに次のとおりです。
socket.write(struct.pack("H", len(data)) #send a two-byte size field
socket.write(data)
そして、受信側は次のようになります。
dataToRead = struct.unpack("H", socket.read(2))[0]
data = socket.read(dataToRead)
これは、ソケット プログラミングの一般的な設計パターンです。ほとんどの設計では、有線構造を拡張して type フィールドも含めるため、受信側は次のようになります。
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プロトコルであり、ネットワーク プロトコルで何度も何度も使用されます。