From 947718c5f668a58cabf0523da51285d2a807f0df Mon Sep 17 00:00:00 2001 From: lqyan Date: Tue, 5 Nov 2024 13:58:17 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E9=A1=B9=E7=9B=AE):=20=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ Dockerfile | 8 ++++++ client/main.go | 45 +++++++++++++++++++++++++++++++++ common/common.go | 30 ++++++++++++++++++++++ go.mod | 5 ++++ go.sum | 2 ++ server/main.go | 66 ++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 158 insertions(+) create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 client/main.go create mode 100644 common/common.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 server/main.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6773729 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +yuchat-proxy-server +yuchat-proxy-client.exe \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..bef5da5 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,8 @@ +from docker.yuchat.top/alpine:3.11 + +workdir /app +expose 8080 + +add yuchat-proxy-server /app + +entrypoint ["./yuchat-proxy-server"] \ No newline at end of file diff --git a/client/main.go b/client/main.go new file mode 100644 index 0000000..6e1c6d7 --- /dev/null +++ b/client/main.go @@ -0,0 +1,45 @@ +package main + +import ( + "log" + "net" + "test-proxy-go/common" + + "github.com/gorilla/websocket" +) + +const ( + localPort = ":1080" + websocketAddress = "ws://proxy.yuchat.top/ws" +) + +func main() { + // 启动TCP监听 + listener, err := net.Listen("tcp", localPort) + if err != nil { + log.Fatal("启动服务失败,错误信息: ", err) + return + } + + log.Println("监听TCP端口成功,端口", localPort) + + for { + conn, err := listener.Accept() + + log.Println("有新的连接:", conn.RemoteAddr()) + if err != nil { + log.Println("Error accepting connection:", err) + continue + } + wsConn, _, err := websocket.DefaultDialer.Dial(websocketAddress, nil) + + if err != nil { + log.Println("Websocket连接失败:", err) + return + } + + log.Println("Websocket连接成功,端口", websocketAddress) + go common.WsToTcpHandler(conn, wsConn) + go common.TcpToWsHandler(conn, wsConn) + } +} diff --git a/common/common.go b/common/common.go new file mode 100644 index 0000000..408366c --- /dev/null +++ b/common/common.go @@ -0,0 +1,30 @@ +package common + +import ( + "net" + + "github.com/gorilla/websocket" +) + +func WsToTcpHandler(conn net.Conn, wsConn *websocket.Conn) { + for { + _, p, err := wsConn.ReadMessage() + if err != nil { + return + } + conn.Write(p) + } +} + +func TcpToWsHandler(conn net.Conn, wsConn *websocket.Conn) { + buf := make([]byte, 1024) + for { + n, err := conn.Read(buf) + if err != nil { + return + } + + wsConn.WriteMessage(websocket.BinaryMessage, buf[:n]) + } + +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..b2e650a --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module test-proxy-go + +go 1.21.0 + +require github.com/gorilla/websocket v1.5.3 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..25a9fc4 --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= diff --git a/server/main.go b/server/main.go new file mode 100644 index 0000000..ce19259 --- /dev/null +++ b/server/main.go @@ -0,0 +1,66 @@ +package main + +import ( + "crypto/tls" + "fmt" + "log" + "net" + "net/http" + "test-proxy-go/common" + + "github.com/gorilla/websocket" +) + +const ( + tcpAddress = "172.20.0.1:1080" +) + +var upgrader = websocket.Upgrader{ + CheckOrigin: func(r *http.Request) bool { + return true // 允许来自任何来源的连接 + }, +} + +func wsHandler(w http.ResponseWriter, r *http.Request) { + fmt.Println("有新的客户端连接了") + conn, err := upgrader.Upgrade(w, r, nil) + if err != nil { + fmt.Println("websocket连接失败:", err) + return + } + remoteConn, err := net.Dial("tcp", tcpAddress) + if err != nil { + log.Printf("本地服务连接失败 %s: %v", tcpAddress, err) + return + } + fmt.Println("本地服务启动成功", tcpAddress) + + go common.WsToTcpHandler(remoteConn, conn) + go common.TcpToWsHandler(remoteConn, conn) +} + +// HTTP GET 接口,返回 "Hello, World!" +func helloHandler(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) // 设置状态码为 200 OK + w.Header().Set("Content-Type", "text/plain") // 设置响应内容类型 + _, err := w.Write([]byte("Hello, World!")) + if err != nil { + log.Println("Write failed:", err) + } +} + +func main() { + server := &http.Server{ + Addr: ":8080", + TLSConfig: &tls.Config{ + InsecureSkipVerify: true, // 可选 + }, + } + http.HandleFunc("/ws", wsHandler) + http.HandleFunc("/hello", helloHandler) + fmt.Println("WebSocket服务已启动,地址:ws://localhost:8080/ws") + if err := server.ListenAndServe(); err != nil { + log.Fatalf("Server failed: %s", err) + } + +}