day05-Go语言“net”包进行简单TCP和UDP通信 | 青训营笔记

170 阅读3分钟

Go语言的net包是标准库中提供的网络编程相关的包,它提供了一组功能丰富的API,用于处理网络通信、连接管理和数据传输等操作。net包提供了对各种网络协议(如TCP、UDP、HTTP等)的支持,以及与网络相关的工具函数和类型。

下面是net包中一些常用的功能和类型:

  1. net.Dial:用于创建网络连接。可以使用它来创建TCP或UDP连接,并指定连接的协议、网络地址和端口号。
  2. net.Listen:用于在指定的网络地址和端口上监听连接请求。可以用于创建TCP或UDP的监听器。
  3. net.Conn:表示网络连接的接口类型。可以使用它进行数据的读取和写入,以及连接的关闭。
  4. net.PacketConn:表示数据包连接的接口类型。用于进行数据包的发送和接收,例如在UDP通信中。
  5. net.TCPConnnet.UDPConn:分别表示TCP和UDP连接的具体类型,实现了net.Conn接口。
  6. net.ResolveIPAddrnet.ResolveTCPAddrnet.ResolveUDPAddr:用于解析IP地址和端口,将字符串形式的地址解析为对应的网络地址。
  7. net.ListenTCPnet.ListenUDP:用于在指定的TCP或UDP网络地址上创建监听器。
  8. net.DialTimeout:在指定的超时时间内建立网络连接。
  9. net.SplitHostPortnet.JoinHostPort:用于分割和拼接网络地址的主机和端口部分。
  10. net.IPnet.IPNet:分别表示IP地址和IP网络的类型。

使用net包进行TCP和UDP通信

TCP通信示例:

导入net包:在代码中导入net包,以便使用其中的TCP相关功能。
建立TCP连接:使用net.Dial函数创建一个TCP连接,指定要连接的服务器地址和端口号。
发送数据:通过net.Conn类型的连接对象,使用Write方法发送数据给服务器。
接收数据:使用Read方法从连接对象中读取服务器返回的数据。
关闭连接:使用Close方法关闭连接。

代码示例:

package main

import (
	"fmt"
	"net"
)

func main() {
	// 建立TCP连接
	conn, err := net.Dial("tcp", "127.0.0.1:8080")
	if err != nil {
		fmt.Println("连接失败:", err)
		return
	}
	defer conn.Close()

	// 发送数据
	message := "Hello, Server!"
	_, err = conn.Write([]byte(message))
	if err != nil {
		fmt.Println("发送数据失败:", err)
		return
	}

	// 接收数据
	buffer := make([]byte, 1024)
	n, err := conn.Read(buffer)
	if err != nil {
		fmt.Println("接收数据失败:", err)
		return
	}
	response := string(buffer[:n])
	fmt.Println("接收到服务器的响应:", response)
}

UDP通信示例:

导入net包:在代码中导入net包,以便使用其中的UDP相关功能。
建立UDP连接:使用net.DialUDP函数创建一个UDP连接,指定要连接的服务器地址和端口号。
发送数据:通过net.UDPConn类型的连接对象,使用Write方法发送数据给服务器。
接收数据:使用ReadFromUDP方法从连接对象中读取服务器返回的数据。
关闭连接:使用Close方法关闭连接。

代码示例:

package main

import (
	"fmt"
	"net"
)

func main() {
	// 建立UDP连接
	udpAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8080")
	if err != nil {
		fmt.Println("解析地址失败:", err)
		return
	}

	conn, err := net.DialUDP("udp", nil, udpAddr)
	if err != nil {
		fmt.Println("连接失败:", err)
		return
	}
	defer conn.Close()

	// 发送数据
	message := []byte("Hello, Server!")
	_, err = conn.Write(message)
	if err != nil {
		fmt.Println("发送数据失败:", err)
		return
	}

	// 接收数据
	buffer := make([]byte, 1024)
	n, _, err := conn.ReadFromUDP(buffer)
	if err != nil {
		fmt.Println("接收数据失败:", err)
		return
	}
	response := string(buffer[:n])
	fmt.Println("接收到服务器的响应:", response)
}