go网关
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 | package main import ( "flag" "fmt" "io" "net" "os" "strings" "sync" ) var lock sync.Mutex var trueList []string var ip string var list string var javaApiHost string func main() { fmt.Println( "into func main" ) //Package flag implements command-line flag parsing. flag.StringVar(&ip, "l" , ":9897" , "-l=0.0.0.0:9897 指定服务监听的端口" ) //flag.StringVar(&list, "d", "127.0.0.1:1789,127.0.0.1:1788", "-d=127.0.0.1:1789,127.0.0.1:1788 指定后端的IP和端口,多个用','隔开") flag.StringVar(&list, "d" , "1.2.3.4:8080" , "-d=1.2.3.4:8080 指定后端的IP和端口,多个用','隔开" ) flag.Parse() trueList = strings.Split(list, "," ) fmt.Println(trueList) if len(trueList) <= 0 { fmt.Println( "后端IP和端口不能空,或者无效" ) os.Exit(1) } server() } func server() { lis, err := net.Listen( "tcp" , ip) if err != nil { fmt.Println(err) return } defer lis.Close() for { conn, err := lis.Accept() if err != nil { fmt.Println( "建立连接错误:%v\n" , err) continue } fmt.Println(conn.RemoteAddr(), conn.LocalAddr()) go handle(conn) } } func handle(sconn net.Conn) { defer sconn.Close() ip, ok := getIP() if !ok { return } dconn, err := net.Dial( "tcp" , ip) if err != nil { fmt.Printf( "连接%v失败:%v\n" , ip, err) return } ExitChan := make( chan bool, 1) go func (sconn net.Conn, dconn net.Conn, Exit chan bool) { _, err := io.Copy(dconn, sconn) fmt.Printf( "往%v发送数据失败:%v\n" , ip, err) ExitChan <- true }(sconn, dconn, ExitChan) go func (sconn net.Conn, dconn net.Conn, Exit chan bool) { _, err := io.Copy(sconn, dconn) fmt.Printf( "从%v接收数据失败:%v\n" , ip, err) ExitChan <- true }(sconn, dconn, ExitChan) <-ExitChan dconn.Close() } func getIP() (string, bool) { lock.Lock() defer lock.Unlock() if len(trueList) < 1 { return "" , false } ip := trueList[0] trueList = append(trueList[1:], ip) return ip, true } |
golang 实现tcp转发代理 - Go语言中文网 - Golang中文社区 https://studygolang.com/articles/7261
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步