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) } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 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(二)