登录
首页 >  Golang >  Go问答

go 中使用现有 net.Conn 的代理服务器

来源:stackoverflow

时间:2024-02-12 15:27:22 436浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《go 中使用现有 net.Conn 的代理服务器》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

溜溜球 我需要帮助在 go 中编写一个代理服务器(无论是 http 还是其他类型),该服务器使用现有的 net.conn 连接,代理将收到的每条消息重定向到现有的 net.conn

如果这是不可能的,是否可以使用现有的 net.conn 发送 http 请求,而不是使用 http.client 或其他工具?

我不太擅长围棋,请发送帮助

编辑0: 应该用作代理的底层 net.conn 来自雪花,这里是提供的代码

package main

import (
    "log"

    sf "git.torproject.org/pluggable-transports/snowflake.git/v2/client/lib"
)

func main() {

    config := sf.ClientConfig{
        BrokerURL:   "https://snowflake-broker.torproject.net.global.prod.fastly.net/",
        FrontDomain: "cdn.sstatic.net",
        ICEAddresses: []string{
            "stun:stun.voip.blackberry.com:3478",
            "stun:stun.stunprotocol.org:3478",
            "stun:stun.altar.com.pl:3478",
            "stun:stun.antisip.com:3478",
            "stun:stun.bluesip.net:3478",
            "stun:stun.dus.net:3478",
            "stun:stun.epygi.com:3478",
            "stun:stun.sonetel.com:3478",
            "stun:stun.sonetel.net:3478",
            "stun:stun.uls.co.za:3478",
            "stun:stun.voipgate.com:3478",
            "stun:stun.voys.nl:3478"},
        Max: 1,
    }
    transport, err := sf.NewSnowflakeClient(config)
    if err != nil {
        log.Fatal("Failed to start snowflake transport: ", err)
    }

    // transport implements the ClientFactory interface and returns a net.Conn
    conn, err := transport.Dial()
    if err != nil {
        log.Printf("dial error: %s", err)
        return
    }
    defer conn.Close()
    //--
    // use conn here to make a proxy and skip the snowstorm closed beta
    for {
    }
}

正确答案


好的,兄弟

这是一个简单的示例程序

import (
    "fmt"
    "io"
    "net"
    "net/http"
)

func handleClient(conn net.Conn) {
    defer conn.Close()

    request, err := http.ReadRequest(bufio.NewReader(conn))
    if err != nil {
        fmt.Println("Error reading request:", err)
        return
    }

     //Modify the request as needed

    response, err := http.DefaultTransport.RoundTrip(request)
    if err != nil {
        fmt.Println("Error sending request:", err)
        return
    }
    defer response.Body.Close()

    response.Write(conn)
}

func main() {
    listener, err := net.Listen("tcp", ":8080")
    if err != nil {
        fmt.Println("Error starting proxy server:", err)
        return
    }
    defer listener.Close()

    fmt.Println("Proxy server is running on port 8080")

    for {
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("Error accepting connection:", err)
            continue
        }
        go handleClient(conn)
    }
}

我们首先创建了一个监听 8080 端口的代理服务器。然后,我们使用 accept 方法接受客户端连接,并在每个连接上启动一个独立的 goroutine 来处理请求。

如果你不擅长围棋,你可能需要学习更多基础知识。 go 是一门很棒的语言,我希望你会喜欢它。

如果我的回答有任何问题,请向我提出

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《go 中使用现有 net.Conn 的代理服务器》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>