ホームページ  >  記事  >  バックエンド開発  >  Go で TCP 読み取り操作のブロックを実現するにはどうすればよいですか?

Go で TCP 読み取り操作のブロックを実現するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-03 14:03:31706ブラウズ

How to Achieve Blocking TCP Read Operations in Go?

Go での TCP 読み取り: ブロック操作と非ブロック操作の詳細

Go では、TCP 接続の Read メソッドは非ブロックで動作します。 -ブロッキング方法。これは、完全なデータが利用できない場合でも、読み取り操作がすぐに返されることを意味します。これは、特定の量のデータを読み取ろうとする場合、または同期されたデータ転送を必要とするプロトコルを処理する場合に問題を引き起こす可能性があります。

TCP 読み取りがノンブロッキングであるのはなぜですか?

ネットワークTCP などの通信プロトコルは、本質的にストリームのような方法でデータを処理します。これは、データは分割して送信および受信でき、単一のデータ パケットの終わりを区切る固有の境界がないことを意味します。

Go でブロッキング読み取りを実現する方法

Read メソッドは非ブロッキングですが、ブロッキングのような動作を実現する手法があります。

  • io.ReadAtLeast: このメソッドは最小バイト数を読み取ります。つながりから。接続がすぐに十分なデータを提供しない場合、メソッドは要求されたデータが受信されるまでブロックされます。
  • io.ReadFull: このメソッドは、指定されたバイト数を接続から正確に読み取ります。接続がすぐに十分なデータを提供しない場合、メソッドはデータ全体が受信されるまでブロックされます。

部分読み取りの管理

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。