概要:
永続的な TCP 接続の管理Go では、受信データを効果的に処理する必要があります。この記事では、net.Conn.Read に関する一般的な誤解に対処し、ストリームベースの TCP 接続からのデータを解析するための実用的なソリューションを提供します。
TCP データ フレームについて:
TCP はストリームベースのプロトコルであり、メッセージ フレーミングを提供しません。これは、受信データ ストリーム内の個々のメッセージの境界を決定するのはアプリケーションの責任であることを意味します。
よくある誤解:
よくある誤解は、net.Conn .Read はメッセージの終わりを自動的に認識し、それに応じて続行します。ただし、これは当てはまりません。
カスタム メッセージ フレーミング:
TCP ストリームからのデータを効果的に解析するには、カスタム メッセージ フレーミング プロトコルを定義する必要があります。これは、メッセージの長さを示すヘッダーを各メッセージに追加することで実現できます。
効率を高めるための bufio.Reader:
読み取り効率を向上させ、追加のメソッドを提供します。解析する場合は、接続をラップすることをお勧めします。 bufio.Reader.
解決策:
次のコード スニペットは、カスタム フレーミングでメッセージを解析する方法の例を示しています。
import ( "bufio" "fmt" "io" "net" ) func main() { ln, err := net.Listen("tcp", ":8080") if err != nil { fmt.Println(err) return } for { conn, err := ln.Accept() if err != nil { fmt.Println(err) return } // Wrap the connection in a bufio.Reader br := bufio.NewReader(conn) for { // Read a single byte containing the message length size, err := br.ReadByte() if err != nil { fmt.Println(err) return } // Read the full message buff := make([]byte, size) _, err = io.ReadFull(br, buff) if err != nil { fmt.Println(err) return } fmt.Printf("Received: %x\n", buff) } } }
結論:
カスタム メッセージを定義することによってプロトコルをフレーミングし、bufio.Reader を使用すると、Go で永続的な TCP ソケットを効率的に処理できます。このアプローチにより、効率的なデータ解析と TCP ストリームを介した堅牢な通信が可能になります。
以上がGo で永続的な TCP 接続とデータ フレーミングを効率的に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。