Go 言語で TCP 接続を作成および管理するのは非常に簡単です。この記事では、Go 言語を使用して TCP サービスを作成し、TCP 接続を転送する方法を紹介します。
この記事を学ぶ前に、次の基本的な知識ポイントを習得する必要があります:
Go 言語で TCP サービスを作成するのは非常に簡単です。まず、net
パッケージと bufio
パッケージをインポートし、net.Listen
メソッドを使用してポート番号をリッスンする必要があります。上記の
package main import ( "bufio" "fmt" "net" ) func main() { ln, err := net.Listen("tcp", ":8080") if err != nil { fmt.Println("Error listening:", err.Error()) return } defer ln.Close() fmt.Println("Listening on port 8080...") }
Listening on port 8080... と出力しました。
ln.Accept() メソッドを使用して、接続の準備ができる前にプログラムをブロックします。接続リクエストがあると、接続を処理するための新しいコルーチンを作成できます。
for { conn, err := ln.Accept() if err != nil { fmt.Println("Error accepting connection:", err.Error()) return } fmt.Println("Connection accepted.") // 处理连接 go handleConnection(conn) } func handleConnection(conn net.Conn) { // 处理连接 }
go handleConnection(conn) を作成します。
bufio パッケージを使用して実行できます。
func handleConnection(conn net.Conn) { defer conn.Close() remoteConn, err := net.Dial("tcp", "127.0.0.1:9090") if err != nil { fmt.Println("Error connecting to remote server:", err.Error()) return } defer remoteConn.Close() go func() { defer conn.Close() defer remoteConn.Close() for { data, err := bufio.NewReader(conn).ReadString(' ') if err != nil { fmt.Println("Error reading from conn:", err.Error()) return } _, err = remoteConn.Write([]byte(data)) if err != nil { fmt.Println("Error writing to remoteConn:", err.Error()) return } } }() // 从remoteConn读取数据并转发到conn for { data, err := bufio.NewReader(remoteConn).ReadString(' ') if err != nil { fmt.Println("Error reading from remoteConn:", err.Error()) return } _, err = conn.Write([]byte(data)) if err != nil { fmt.Println("Error writing to conn:", err.Error()) return } } }
net.Dial メソッドを使用して別のサーバーに接続し、次に 2 つのコルーチンを開始します。1 つのコルーチンは、クライアントから送信されたデータを読み取り、次のサーバーに転送します。別のサーバーの場合は、別のコルーチンがサーバーからデータを読み取り、クライアントに転送します。
defer conn.Close() と
defer RemoteConn.Close() を使用する必要があることに注意してください。思いがけず閉店。
package main import ( "bufio" "fmt" "net" ) func main() { ln, err := net.Listen("tcp", ":8080") if err != nil { fmt.Println("Error listening:", err.Error()) return } defer ln.Close() fmt.Println("Listening on port 8080...") for { conn, err := ln.Accept() if err != nil { fmt.Println("Error accepting connection:", err.Error()) return } fmt.Println("Connection accepted.") go handleConnection(conn) } } func handleConnection(conn net.Conn) { defer conn.Close() remoteConn, err := net.Dial("tcp", "127.0.0.1:9090") if err != nil { fmt.Println("Error connecting to remote server:", err.Error()) return } defer remoteConn.Close() go func() { defer conn.Close() defer remoteConn.Close() for { data, err := bufio.NewReader(conn).ReadString(' ') if err != nil { fmt.Println("Error reading from conn:", err.Error()) return } _, err = remoteConn.Write([]byte(data)) if err != nil { fmt.Println("Error writing to remoteConn:", err.Error()) return } } }() for { data, err := bufio.NewReader(remoteConn).ReadString(' ') if err != nil { fmt.Println("Error reading from remoteConn:", err.Error()) return } _, err = conn.Write([]byte(data)) if err != nil { fmt.Println("Error writing to conn:", err.Error()) return } } }
以上がgolang フォワード tcpの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。