go http数据转发

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package main
 
import (
    "bytes"
    "flag"
    "fmt"
    "io"
    "log"
    "net"
    "os"
    "strings"
    "time"
)
 
func main() {
    var srcHost, agencyHost string
    flag.StringVar(&srcHost, "srcHost", "", "srcHost")
    flag.StringVar(&agencyHost, "agencyHost", "", "agencyHost")
    flag.Parse()
    if srcHost == "" || agencyHost == "" {
        fmt.Fprintf(os.Stderr, "Fatal error: %s", "参数为空")
        os.Exit(1)
    }
    //建立socket,监听端口
    netListen, err := net.Listen("tcp", srcHost)
    CheckError(err)
    defer netListen.Close()
 
    Log("Waiting for clients")
    for {
        conn, err := netListen.Accept()
        //如果没有请求就一直等待
        if err != nil {
            continue
        }
        if conn != nil {
            Log(conn.RemoteAddr().String(), " tcp connect success")
            go handleConnection(conn, agencyHost) //go 可以实现异步并发请求
        }
    }
}
 
//处理连接
func handleConnection(conn net.Conn, agencyHost string) {
    time.Sleep(10 * time.Millisecond)
    buffer := ReceiveData(conn)
    if len(buffer) > 1 {
        arr := strings.Split(string(buffer), "\r\n")
        if len(arr) > 1 {
            arr[1] = "Host: " + agencyHost
            newstr := strings.Join(arr, "\r\n")
            SendAgencyHost([]byte(newstr), agencyHost, conn)
        }
    }
    conn.Close()
}
func SendAgencyHost(data []byte, host string, baseconn net.Conn) {
    conn, _ := net.Dial("tcp", host)
    conn.Write(data)
    time.Sleep(10 * time.Millisecond)
    bufferHead := ReceiveData(conn)
    time.Sleep(10 * time.Millisecond)
    bufferBody := ReceiveData(conn)
    var buf bytes.Buffer
    buf.Write(bufferHead)
    buf.Write(bufferBody)
    baseconn.Write(buf.Bytes())
    conn.Close()
}
 
//接收数据统一方法
func ReceiveData(conn net.Conn) []byte {
    var buf bytes.Buffer
    buffer := make([]byte, 8192)
    for {
        sizenew, err := conn.Read(buffer)
        buf.Write(buffer[:sizenew])
        if err == io.EOF || sizenew < 8192 {
            break
        }
    }
    return buf.Bytes()
}
 
//打印信息统一方法
func Log(v ...interface{}) {
    log.Println(v...)
}
 
//执行错误处理方法
func CheckError(err error) {
    if err != nil {
        fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
        os.Exit(1)
    }
}

查看原文: https://my.oschina.net/u/252343/blog/828034

posted @   -零  阅读(599)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2019-02-23 Django之Models(三)
2019-02-23 Django之Models(二)
点击右上角即可分享
微信分享提示