一、网络通信的步骤
服务端
1.socket()
创建通信的套接字socket:ip:addr
2.bind()
将套接字绑定监听的地址和端口号,作用是:服务器一般有很多网卡,多个IP地址,bind指定具体监听 哪一个IP地址及对应的端口号(若服务器有3个网卡,192.168.66.1,192.168.66.2,192.168.66.3,bind绑定的是192.168.66.3,那当且仅当客户端请求发送给192.168.66.3时才能被监听到,并进行请求的处理)。
**全0的IP地址表示监听所有网卡的请求,无论请求的是哪一个IP都能连接上**
**0端口是一种由系统指定动态生成的端口。也即是说,监听端口0,系统会自动重新分配一个系统空闲的端口**
3.listen()
使用上面创建的套接字循环监听bind上IP到来的请求(两个队列)
4.accept()
请求到来时,accpet复制该套接字的请求进行处理。
客户端
1.socket()
创建套接字
2.connect() (可选)
使用上面的套接字连接服务端IP和port,进行通信
**UDP通信不需要客户端建立连接,因此不需要connect**
二、TCP通信步骤
三、UDP通信步骤和示例
四、golang UDP IPV6通信代码及测试
参考博客
https://blog.csdn.net/weixin_45477086/article/details/122901328
以下测试均为全局单播地址,本地链路地址的UDP通信还需测试(是否需要zone)
1.客户端
代码
// 客户端向服务端:端口发送数据
func UDPIPV6Client(IP string, p ort int) {
//1.创建要访问的服务端地址
serverAddr := &net.UDPAddr{IP: net.ParseIP(IP), Port: port}
//2.创建和服务器的连接
conn, err := net.DialUDP("udp", nil, serverAddr)
if err != nil {
fmt.Println("net.DialUDP failed,err:", err.Error())
return
}
defer conn.Close()
//3.发送数据
conn.Write([]byte("hello"))
fmt.Println("conn.Write data:hello")
//4.接收数据
buf := make([]byte, 1024)
conn.Read(buf)
fmt.Println("conn read data:", buf)
}
测试:本地模拟服务端测试客户端代码
工具:nc(netCat)(centos安装nc:yum install nc -y)
测试方法:
(1)centos模拟本地服务器:centos终端输入 nc -6lup 666
(2) 运行客户端代码
2.服务端
代码
//服务端向客户端:端口发送并读取数据
func UDPIPV6Server(ip string, port int) {
//1.创建监听地址 IPv4服务器和IPV6客户端
srcAddr := &net.UDPAddr{IP: net.IPv6zero, Port: 0}
//2.进行监听
conn, err := net.ListenUDP("udp", srcAddr)
if err != nil {
fmt.Println("net.ListenUDP failed,err:", err.Error())
return
}
defer conn.Close()
//3.写数据 本地模拟一个客户端,向1234端口发送数据
dstAddr := &net.UDPAddr{IP: net.ParseIP(ip), Port: port}
conn.WriteToUDP([]byte("hello"), dstAddr)
fmt.Println("writeToUDP data: hello")
//4.读数据
data := make([]byte, 5125)
if _, _, err = conn.ReadFromUDP(data); err != nil {
fmt.Println("readFromUDP failed ,err:", err.Error())
return
}
fmt.Println("readFromUDP data:", data)
}
测试:centos客户端测试服务端代码
工具:nc(netCat,telnet可以模拟客户端,但只能进行TCP测试)
系统:centos 以IPV6地址互相联通,配置方法;
测试方法:
(1)centos模拟本地客户端:centos终端输入:nc -6lup 777
(2) 另一台运行服务端代码 ,进行数据发送