Go 言語は、TCP/IP ソケットを含む多数のネットワーク プログラミング ライブラリを提供する強力なプログラミング言語です。この記事では主にTCPプログラミングにGo言語を使用する方法を紹介します。
1. TCP/IP
TCP/IP は、ネットワーク通信の基礎であり、インターネットのコア プロトコルであるプロトコル スイートであり、ネットワーク内でのデータの送信を担当します。通信網。これには、TCP と IP の 2 つのプロトコルが含まれており、TCP はデータグラム送信の信頼性を提供し、IP はデータグラム送信の転送を担当します。
2. Go での TCP プログラミング
Go 言語の net パッケージは、主に次の関数を含む、TCP プログラミングに関連する API を提供します:
以下では、これらの関数を TCP プログラミングに使用する方法を紹介します。
クライアントは net.DialTCP() 関数を使用して、サーバーへの TCP 接続を確立できます。以下はサンプル コードです。
package main import ( "fmt" "net" ) func main() { conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ IP: net.IPv4(127, 0, 0, 1), Port: 9999, }) if err != nil { fmt.Println(err) return } defer conn.Close() fmt.Println("Connected!") }
上記のコードでは、DialTCP() 関数の最初のパラメータはネットワーク プロトコル タイプを表す文字列「tcp」で、2 番目のパラメータはアドレス構造です。指定した接続先に接続します。ここでは、ローカル IP アドレス 127.0.0.1 のポート 9999 への接続を指定します。接続に成功すると「Connected!」と出力されます。
サーバーは net.ListenTCP() 関数を使用して、特定の TCP ポートでリッスンできます。以下にサンプル コードを示します。
package main import ( "fmt" "net" ) func main() { tcpListener, err := net.ListenTCP("tcp", &net.TCPAddr{ IP: net.IPv4(0, 0, 0, 0), Port: 9999, }) if err != nil { fmt.Println(err) return } defer tcpListener.Close() fmt.Println("Listening on port", 9999) for { conn, err := tcpListener.AcceptTCP() if err != nil { fmt.Println(err) continue } fmt.Println("New client connected.") go handleClient(conn) } } func handleClient(conn *net.TCPConn) { defer conn.Close() // TODO: 处理客户端请求 }
上記のコードでは、ListenTCP() 関数の最初のパラメータはネットワーク プロトコル タイプを表す文字列「tcp」で、2 番目のパラメータはアドレス構造です。リスニング IP アドレスとポート番号を指定します。ここでは、すべての IP アドレスをリッスンするポート 9999 を指定します。リスニングに成功すると、「Listening on port 9999」と出力されます。
次に、無限ループで AcceptTCP() 関数を呼び出し、クライアントの接続を待ちます。クライアントが接続されると、クライアントのリクエストを処理する新しいゴルーチンが作成され、コンソールに「新しいクライアントが接続されました。」と出力されます。
TCP 接続を処理するコードは、多くの場合、より複雑です。一般に、bufio.NewReader() 関数を使用してクライアントのリクエスト データを読み取り、bufio.NewWriter() 関数を使用して応答データを書き込む必要があります。
以下は、TCP 接続を処理するためのサンプル コードです:
func handleClient(conn *net.TCPConn) { defer conn.Close() // 读取客户端请求 reader := bufio.NewReader(conn) req, err := reader.ReadString(' ') if err != nil { fmt.Println(err) return } fmt.Println("Received request:", req) // 发送响应数据 writer := bufio.NewWriter(conn) resp := "Hello, client! " _, err = writer.WriteString(resp) if err != nil { fmt.Println(err) return } writer.Flush() }
上記のコードでは、まず、クライアント リクエストを読み取るための bufio.NewReader() オブジェクトを作成します。データを読み取った後、応答データを書き込むための bufio.NewWriter() オブジェクトを作成します。 bufio.NewWriter() 関数を使用してライターを作成すると、出力データがキャッシュされ、パフォーマンスが向上することに注意してください。
最後に、WriteString() 関数を使用して応答データをライターに書き込み、Flush() 関数を呼び出してバッファ データを送信します。
3. 完全な例
最後に、クライアントとサーバーを含む完全な TCP プログラミングの例を示します:
サーバー コード:
package main import ( "bufio" "fmt" "net" ) func main() { tcpListener, err := net.ListenTCP("tcp", &net.TCPAddr{ IP: net.IPv4(0, 0, 0, 0), Port: 9999, }) if err != nil { fmt.Println(err) return } defer tcpListener.Close() fmt.Println("Listening on port", 9999) for { conn, err := tcpListener.AcceptTCP() if err != nil { fmt.Println(err) continue } fmt.Println("New client connected.") go handleClient(conn) } } func handleClient(conn *net.TCPConn) { defer conn.Close() // 读取客户端请求 reader := bufio.NewReader(conn) req, err := reader.ReadString(' ') if err != nil { fmt.Println(err) return } fmt.Println("Received request:", req) // 发送响应数据 writer := bufio.NewWriter(conn) resp := "Hello, client! " _, err = writer.WriteString(resp) if err != nil { fmt.Println(err) return } writer.Flush() }
クライアント コード:
package main import ( "bufio" "fmt" "net" ) func main() { conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ IP: net.IPv4(127, 0, 0, 1), Port: 9999, }) if err != nil { fmt.Println(err) return } defer conn.Close() // 发送请求数据 writer := bufio.NewWriter(conn) req := "Hello, server! " _, err = writer.WriteString(req) if err != nil { fmt.Println(err) return } writer.Flush() // 接收响应数据 reader := bufio.NewReader(conn) resp, err := reader.ReadString(' ') if err != nil { fmt.Println(err) return } fmt.Println("Received response:", resp) }
上記のコードでは、サーバーはまずポート 9999 をリッスンし、次にクライアントが接続するのを待ちます。クライアントが接続すると、サーバーはクライアント要求を読み取り、応答データを送信します。
クライアントはまずサーバーへの TCP 接続を確立し、次にリクエスト データをサーバーに送信します。リクエストを送信した後、クライアントはサーバーからの応答データの受信を待ちます。
4. 概要
この記事では、TCP プログラミングに Go 言語を使用する方法を紹介します。 TCP/IP プロトコルの基本を学習し、ネット パッケージで提供される API を使用して Go 言語で TCP プログラミングを実装する方法を紹介しました。同時に、この記事では完全な例を提供します。読者の役に立つことを願っています。
以上がGo で TCP を使用してプログラミングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。