永続的な接続を備えた TCP ソケットについて
Go の net.Conn は、ネットワーク接続を処理するための重要なインターフェイスを提供しますが、固有のメッセージ フレーミングが不足しています。この記事は、永続的な TCP ソケットに net.Conn.Read を効果的に使用する方法を明らかにし、基本的な原則に対処することを目的としています。
完全なメッセージ受信の区別
プロトコルとは異なりますHTTP と同様に、TCP はメッセージをネイティブにフレーム化しません。代わりに、データを継続的にストリーミングします。したがって、Read() のみを使用してメッセージの完全性を判断することは困難です。 net.Conn.Read 関数はバイト単位で動作し、メッセージ構造全体の可視性が制限されています。
メッセージ解析の実装
これを克服するには制限があるため、アプリケーション内でメッセージ解析を実装する必要があります。一般的なアプローチの 1 つは、バッファー付きリーダー (bufio.Reader など) を使用してストリーム データを効率的に読み取り、定義されたプロトコルに基づいてメッセージ解析を容易にすることです。
メッセージ ヘッダーを含むプロトコルの例
メッセージの最初のバイトがその長さを示すプロトコルを考えてみましょう。バッファー付きリーダーを使用してこのようなメッセージを解析するには、コードは次のようになります。
import ( "bufio" "fmt" ) func main() { // Wrap the TCP connection in a buffered reader c := bufio.NewReader(conn) for { // Read a single byte to determine message size size, err := c.ReadByte() if err != nil { return err } // Allocate buffer for the message buff := make([]byte, size) // Read the full message into the buffer _, err = io.ReadFull(c, buff[:int(size)]) if err != nil { return err } // Process or store the message fmt.Printf("Received message: %x\n", buff) } }
この例では、各メッセージの最初のバイトがヘッダーとして機能し、メッセージの長さを示します。バッファー付きリーダーはこのヘッダー バイトを読み取り、続いてメッセージの残りのバイトをバッファーに書き込みます。このアプローチにより、アプリケーションは、サイズに関係なく、メッセージを一貫して解析できます。
結論
TCP にはメッセージ フレーミングがないことを理解し、カスタム解析メカニズムを実装することで、開発者は永続的な TCP 接続を効果的に管理し、さまざまなメッセージ形式を処理できます。バッファー付きリーダーとプロトコル固有のロジックを使用すると、アプリケーションは受信データを効率的に消費し、それに応じて応答できるようになります。
以上がGo の「net.Conn」を使用して永続的な TCP 接続からのメッセージを効果的に解析するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。