ZBLOG

golang tcp编程解析

Go语言中的TCP编程是通过标准库net包提供的,该包提供了实现TCP/IP协议的基本功能。

  1. 创建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) {
    // 处理连接请求
}
  1. 连接到TCP服务器

客户端可以使用net.Dial()函数来连接到一个TCP服务器。该函数返回一个Conn对象,表示客户端与服务端之间的连接。

conn, err := net.Dial("tcp", "localhost:8080")
if err != nil {
    log.Fatal(err)
}
defer conn.Close()
  1. 发送和接收数据

发送和接收数据可以使用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)
}
  1. 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)

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=6461

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?