バイナリデータを送信する簡単なオプションは、長さ接頭辞を使用することです。データサイズを32ビットビッグエンディアンの整数としてエンコードし、そのデータ量を読み込みます。
// create the length prefix
prefix := make([]byte, 4)
binary.BigEndian.PutUint32(prefix, uint32(len(message)))
// write the prefix and the data to the stream (checking errors)
_, err := conn.Write(prefix)
_, err = conn.Write(message)
とメッセージを読むために
// read the length prefix
prefix := make([]byte, 4)
_, err = io.ReadFull(conn, prefix)
length := binary.BigEndian.Uint32(prefix)
// verify length if there are restrictions
message = make([]byte, int(length))
_, err = io.ReadFull(conn, message)
参照してくださいあなたはまた、もちろん、メッセージングのニーズになどHTTP、IRC、のような既存の、ほかの試験プロトコルを、使用することができますもGolang: TCP client/server data delimiter
。 go stdライブラリには、単純なtextproto
packageが付属しています。あるいは、JSONのような一様なエンコーディングでメッセージを囲むこともできます。
TCPはストリーム指向のプロトコルであり、「メッセージ」を持たない。あなたのメッセージをフレーム化するには、別のプロトコルが必要です。あなたは単に長さ接頭辞、ネットストリング、bencode、HTTPを使用することができます、多くのオプションがあります。 – JimB
@JimB長さ接頭辞を使用した簡単な例を教えてください。これはゴランを使った私の最初のプロジェクトで、ネットワーキングに関する多くの経験はありません。ありがとう。 –
フレーミングの問題とは別に、バッファが破棄されるため、 'bufio.NewReader(conn).ReadString( '\ n')というコードが問題の原因になります。 bufio.Readerは、接続ごとに1回作成します。アプリケーションが接続から読み取るたびに作成するのではありません。 –