Go语言中的TCP编程是通过标准库net包提供的,该包提供了实现TCP/IP协议的基本功能。
- 创建TCP服务器
通过调用net.Listen()函数可以创建一个TCP服务器。该函数返回一个Listener对象,表示监听器,它会监听指定地址和端口号上的连接请求,并将其转发到处理程序。
listener, err := net.Listen("tcp", "localhost:8080")
if err != nil {
log.Fatal(err)
}
defer listener.Close()
for {
conn, err := listener.Accept()
if err != nil {
log.Println(err)
continue
}
go handleConnection(conn)
}
func handleConnection(conn net.Conn) {
// 处理连接请求
}
- 连接到TCP服务器
客户端可以使用net.Dial()函数来连接到一个TCP服务器。该函数返回一个Conn对象,表示客户端与服务端之间的连接。
conn, err := net.Dial("tcp", "localhost:8080")
if err != nil {
log.Fatal(err)
}
defer conn.Close()
- 发送和接收数据
发送和接收数据可以使用Conn对象提供的Read()和Write()方法。
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
log.Fatal(err)
}
data := buf[:n]
_, err = conn.Write(data)
if err != nil {
log.Fatal(err)
}
- TCP粘包问题
当一次发送的数据大小小于网络传输时的MTU(Maximum Transmission Unit),那么这些数据就会被合并成一段较大的数据包,这就是TCP粘包问题。
为了解决这个问题,可以在发送的数据中添加一个长度字段。接收方先读取长度字段来得到数据大小,然后再读取对应大小的数据。
// 发送数据
data := []byte("Hello, world!")
length := len(data)
buf := make([]byte, 4+length)
binary.BigEndian.PutUint32(buf[:4], uint32(length))
copy(buf[4:], data)
_, err = conn.Write(buf)
if err != nil {
log.Fatal(err)
}
// 接收数据
bufLen := make([]byte, 4)
_, err = conn.Read(bufLen)
if err != nil {
log.Fatal(err)
}
length := binary.BigEndian.Uint32(bufLen)
dataBuf := make([]byte, length)
_, err = io.ReadFull(conn, dataBuf)
if err != nil {
log.Fatal(err)
}
data := string(dataBuf)




