如何在Golang中使用net包实现网络通信

net包是golang网络编程核心,支持TCP、udp等协议。通过net.Listen创建TCP服务器,net.Dial实现客户端通信,使用goroutine处理并发连接;UDP则用net.ListenPacket和ResolveUDPAddr实现无连接通信;需注意地址解析、错误处理及设置读写超时,及时关闭连接以避免资源泄漏。

如何在Golang中使用net包实现网络通信

golang中,net包是实现网络通信的核心工具,支持TCP、UDP、unix域套接字等协议。它提供了简洁的API来创建服务器和客户端,适合构建高性能的网络服务。

使用TCP实现基本通信

TCP是一种可靠的面向连接的协议,适用于需要稳定传输的场景。通过net.Listen启动一个TCP服务器,监听指定地址和端口

服务器示例:

func startServer() {
  listener, err := net.Listen(“tcp”, “:8080”)
  if err != nil {
    log.Fatal(err)
  }
  defer listener.Close()

  for {
    conn, err := listener.Accept()
    if err != nil {
      continue
    }
    go handleConnection(conn)
  }
}

func handleConnection(conn net.Conn) {
  defer conn.Close()
  buffer := make([]byte, 1024)
  n, _ := conn.Read(buffer)
  fmt.Println(“收到:”, String(buffer[:n]))
  conn.Write([]byte(“已收到消息”))
}

客户端通过net.Dial连接服务器并发送数据:

立即进入豆包AI人工智官网入口”;

立即学习豆包AI人工智能在线问答入口”;

func startClient() {
  conn, err := net.Dial(“tcp”, “localhost:8080”)
  if err != nil {
    log.Fatal(err)
  }
  defer conn.Close()

  conn.Write([]byte(“你好,服务器”))
  buffer := make([]byte, 1024)
  n, _ := conn.Read(buffer)
  fmt.Println(“响应:”, string(buffer[:n]))
}

处理UDP通信

UDP是无连接协议,适合对实时性要求高但可容忍部分丢包的场景,如音视频传输。

UDP服务器使用net.ListenPacket监听:

func startUDPServer() {
  addr, _ := net.ResolveUDPAddr(“udp”, “:9000”)
  conn, _ := net.ListenUDP(“udp”, addr)
  defer conn.Close()

  buffer := make([]byte, 1024)
  n, clientAddr, _ := conn.ReadFromUDP(buffer)
  fmt.Println(“收到UDP:”, string(buffer[:n]))
  conn.WriteToUDP([]byte(“UDP响应”), clientAddr)
}

UDP客户端示例:

如何在Golang中使用net包实现网络通信

豆包爱学

豆包旗下AI学习应用

如何在Golang中使用net包实现网络通信26

查看详情 如何在Golang中使用net包实现网络通信

func sendUDP() {
  addr, _ := net.ResolveUDPAddr(“udp”, “localhost:9000”)
  conn, _ := net.DialUDP(“udp”, nil, addr)
  defer conn.Close()

  conn.Write([]byte(“UDP消息”))
  buffer := make([]byte, 1024)
  conn.Read(buffer)
  fmt.Println(“UDP回复:”, string(buffer))
}

解析地址与错误处理

在实际应用中,需正确解析网络地址。使用net.ParseIP验证IP,net.ResolveTCPAddrResolveUDPAddr解析具体地址。

常见错误包括端口被占用、权限不足、连接超时。建议始终检查返回的Error值,并合理设置超时:

conn.SetReadDeadline(time.Now().Add(5 * time.Second))
conn.SetWriteDeadline(time.Now().Add(5 * time.Second))

这样可以避免程序长时间阻塞。

并发与资源管理

每个新连接应交给独立的goroutine处理,保证服务器能同时服务多个客户端。

注意及时关闭连接(conn.Close()),防止文件描述符泄漏。大型服务建议结合context控制生命周期。

基本上就这些。net包设计简洁,配合Go的并发模型,很容易写出高效稳定的网络程序。关键在于理解不同协议的特点,并做好连接管理和错误恢复。不复杂但容易忽略细节。

上一篇
下一篇
text=ZqhQzanResources