golang フォワード tcp

WBOY
リリース: 2023-05-16 14:45:37
オリジナル
732 人が閲覧しました

Go 言語で TCP 接続を作成および管理するのは非常に簡単です。この記事では、Go 言語を使用して TCP サービスを作成し、TCP 接続を転送する方法を紹介します。

  1. 前提知識

この記事を学ぶ前に、次の基本的な知識ポイントを習得する必要があります:

  • Go 言語の基礎知識
  • TCP プロトコルの基本概念と使用法
  1. 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...")
}
ログイン後にコピー

の例では、8080 ポート番号をリッスンし、コンソールに

Listening on port 8080... と出力しました。

    TCP 接続を受け入れる
次に、TCP 接続を受け入れる必要があります。

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) を作成します。

    TCP 接続の処理
次に、接続を処理する必要があります。クライアント接続ごとに、クライアントから送信されたすべてのデータを別のサーバーに転送する必要があります。読み取りと書き込みは、

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() を使用する必要があることに注意してください。思いがけず閉店。

    完全なコード
完全な TCP 転送サービス コードは次のとおりです:

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
        }
    }
}
ログイン後にコピー

    概要
Go この言語を使用すると、TCP 接続の作成と管理が簡単になります。この記事ではGo言語を使ってTCPサービスを作成して転送する方法を紹介しますので、ご参考になれば幸いです。

以上がgolang フォワード tcpの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート