Go语言中可以非常轻松地创建和管理TCP连接。本文将介绍如何使用Go语言创建TCP服务并转发TCP连接。
- 前置知识
在学习本文之前,需要掌握以下基本知识点:
- Go语言基础知识
- TCP协议的基本概念和使用
- 创建TCP服务
netbufionet.Listenpackage main
import (
"bufio"
"fmt"
"net"
)
func main() {
ln, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("Error listening:", err.Error())
return
}
defer ln.Close()
fmt.Println("Listening on port 8080...")
}Listening on port 8080...- 接受TCP连接
ln.Accept()for {
conn, err := ln.Accept()
if err != nil {
fmt.Println("Error accepting connection:", err.Error())
return
}
fmt.Println("Connection accepted.")
// 处理连接
go handleConnection(conn)
}
func handleConnection(conn net.Conn) {
// 处理连接
}go handleConnection(conn)- 处理TCP连接
bufiofunc handleConnection(conn net.Conn) {
defer conn.Close()
remoteConn, err := net.Dial("tcp", "127.0.0.1:9090")
if err != nil {
fmt.Println("Error connecting to remote server:", err.Error())
return
}
defer remoteConn.Close()
go func() {
defer conn.Close()
defer remoteConn.Close()
for {
data, err := bufio.NewReader(conn).ReadString('
')
if err != nil {
fmt.Println("Error reading from conn:", err.Error())
return
}
_, err = remoteConn.Write([]byte(data))
if err != nil {
fmt.Println("Error writing to remoteConn:", err.Error())
return
}
}
}()
// 从remoteConn读取数据并转发到conn
for {
data, err := bufio.NewReader(remoteConn).ReadString('
')
if err != nil {
fmt.Println("Error reading from remoteConn:", err.Error())
return
}
_, err = conn.Write([]byte(data))
if err != nil {
fmt.Println("Error writing to conn:", err.Error())
return
}
}
}net.Dialdefer conn.Close()defer remoteConn.Close()- 完整代码
以下是完整的TCP转发服务代码:
package main
import (
"bufio"
"fmt"
"net"
)
func main() {
ln, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("Error listening:", err.Error())
return
}
defer ln.Close()
fmt.Println("Listening on port 8080...")
for {
conn, err := ln.Accept()
if err != nil {
fmt.Println("Error accepting connection:", err.Error())
return
}
fmt.Println("Connection accepted.")
go handleConnection(conn)
}
}
func handleConnection(conn net.Conn) {
defer conn.Close()
remoteConn, err := net.Dial("tcp", "127.0.0.1:9090")
if err != nil {
fmt.Println("Error connecting to remote server:", err.Error())
return
}
defer remoteConn.Close()
go func() {
defer conn.Close()
defer remoteConn.Close()
for {
data, err := bufio.NewReader(conn).ReadString('
')
if err != nil {
fmt.Println("Error reading from conn:", err.Error())
return
}
_, err = remoteConn.Write([]byte(data))
if err != nil {
fmt.Println("Error writing to remoteConn:", err.Error())
return
}
}
}()
for {
data, err := bufio.NewReader(remoteConn).ReadString('
')
if err != nil {
fmt.Println("Error reading from remoteConn:", err.Error())
return
}
_, err = conn.Write([]byte(data))
if err != nil {
fmt.Println("Error writing to conn:", err.Error())
return
}
}
}- 总结
Go语言使得创建和管理TCP连接变得轻而易举。本文介绍了如何使用Go语言创建TCP服务并进行转发,希望对你有所帮助。