#Golang实现 TCP代理
TCP代理
server.go
先做一个TCP服务器,监听8080端口
package main
import (
"fmt"
"net"
)
func main() {
// 监听本地的TCP端口
l, err := net.Listen("tcp", "127.0.0.1:8080")
if err != nil {
panic(err)
}
defer l.Close()
// 接收客户端连接
for {
conn, err := l.Accept()
if err != nil {
panic(err)
}
fmt.Println("接收到新的连接:", conn.RemoteAddr())
// 在新的协程中处理连接
go handleConn(conn)
}
}
func handleConn(conn net.Conn) {
defer conn.Close()
// 接收客户端发送的消息
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
fmt.Println("接收消息失败:", err)
return
}
fmt.Println("收到客户端消息:", string(buf[:n]))
// 发送消息给客户端
msg := "Hello, client! this is 8080"
_, err = conn.Write([]byte(msg))
if err != nil {
fmt.Println("发送消息失败:", err)
return
}
fmt.Println("已向客户端发送消息:", msg)
}
代理函数
package main
import (
"fmt"
"net"
)
func main() {
// 监听80端口
listener, err := net.Listen("tcp", "127.0.0.1:80")
if err != nil {
fmt.Println("监听失败", err)
return
}
defer listener.Close()
for {
// 接受客户端连接
clientConn, err := listener.Accept()
if err != nil {
fmt.Println("error:", err)
return
}
fmt.Println("接收到新的连接:", clientConn.RemoteAddr())
// 连接目标服务器
serverConn, err := net.Dial("tcp", "127.0.0.1:8080")
if err != nil {
fmt.Println("error:", err)
clientConn.Close()
continue
}
// 启动代理
go proxy(clientConn, serverConn)
}
}
// 代理函数
func proxy(client net.Conn, server net.Conn) {
defer client.Close()
defer server.Close()
// 从客户端读取数据并转发到目标服务器
go func() {
for {
buf := make([]byte, 1024*1024)
n, err := client.Read(buf)
if err != nil {
return
}
server.Write(buf[0:n])
}
}()
// 从目标服务器读取数据并转发回客户端
for {
buf := make([]byte, 1024*1024)
n, err := server.Read(buf)
if err != nil {
return
}
client.Write(buf[0:n])
}
}
)]