Go での TCP 読み取り: ブロック操作と非ブロック操作の詳細
Go では、TCP 接続の Read メソッドは非ブロックで動作します。 -ブロッキング方法。これは、完全なデータが利用できない場合でも、読み取り操作がすぐに返されることを意味します。これは、特定の量のデータを読み取ろうとする場合、または同期されたデータ転送を必要とするプロトコルを処理する場合に問題を引き起こす可能性があります。
TCP 読み取りがノンブロッキングであるのはなぜですか?
ネットワークTCP などの通信プロトコルは、本質的にストリームのような方法でデータを処理します。これは、データは分割して送信および受信でき、単一のデータ パケットの終わりを区切る固有の境界がないことを意味します。
Go でブロッキング読み取りを実現する方法
Read メソッドは非ブロッキングですが、ブロッキングのような動作を実現する手法があります。
部分読み取りの管理
Read メソッドから受信したデータの量が予想よりも少ないため、部分的な読み取りに対する適切な処理を決定することが重要です。プロトコルでは、多くの場合、データ パケットまたはメッセージの終わりを示すために区切り文字やその他のメカニズムが使用されます。
エラー処理を含むサンプル コード
提供されたコード スニペットでは、Read メソッドが適切に使用されていません。部分的な読み取りを考慮してエラーを処理するには、コードを変更する必要があります。
<code class="go">// Server Code package main import ( "fmt" "log" "net" ) func main() { listener, err := net.ListenTCP("tcp", &net.TCPAddr{IP: net.ParseIP("127.0.0.1"), Port: 4243}) if err != nil { log.Fatal(err) } defer listener.Close() for { conn, err := listener.AcceptTCP() if err != nil { log.Fatal(err) } conn.SetNoDelay(false) data := make([]byte, 512) for { n, err := conn.Read(data) if err != nil { fmt.Println(err) break } fmt.Println(data[:n]) } } }</code>
<code class="go">// Client Code package main import ( "log" "net" ) func main() { conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{IP: net.ParseIP("127.0.0.1"), Port: 4243}) if err != nil { log.Fatal(err) } conn.SetNoDelay(false) conn.Write([]byte("Hello World")) }</code>
潜在的な問題がすぐに特定され、処理されるように、コード全体で一貫してエラーをチェックすることを忘れないでください。
以上がGo で TCP 読み取り操作のブロックを実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。