UDP 与 TCP 的差异
TCP | UDP |
---|
面向连接 | 面向无连接 | 要求系统资源较多 | 要求系统资源较少 | TCP 程序结构较复杂 | UDP 程序结构较简单 | 使用流式 | 使用数据报式 | 保证数据准确性 | 不保证数据准确性 | 保证数据顺序 | 不保证数据顺序 | 通讯速度较慢 | 通讯速度较快 |
UDP 服务器
由于 UDP 是“无连接”的,所以,服务器端不需要额外创建监听套接字,只需要指定好 IP 和 port,然后监听 该地址,等待客户端与之建立连接,即可通信。
func ResolveUDPAddr(network, address string) (*UDPAddr, error)
func ListenUDP(network string, laddr *UDPAddr) (*UDPConn, error)
func (c *UDPConn) ReadFromUDP(b []byte) (int, *UDPAddr, error)
func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (int, error)
udp go-server
package server
import (
"fmt"
"net"
)
func Udpserver() {
addr,e:=net.ResolveUDPAddr("udp","127.0.0.1:8002")
if e != nil {
fmt.Println("ResolveUDPAddr",e)
return
}
c,e1:=net.ListenUDP("udp",addr)
if e1 != nil {
fmt.Println("ListenUDP",e1)
return
}
defer c.Close()
b:=make([]byte,1024)
lenc, addrc,e3:=c.ReadFromUDP(b)
if e3 != nil {
fmt.Println("ReadFromUDP",e3)
}
fmt.Println("client:",string(b[:lenc]))
_,e2:=c.WriteToUDP([]byte("get your request!"), addrc)
if e2 != nil {
fmt.Println("WriteToUDP",e2)
return
}
}
udp go-client
package client
import (
"fmt"
"net"
)
func Udpclient() {
c,e:=net.Dial("udp","127.0.0.1:8002")
if e != nil {
fmt.Println("Dial",e)
return
}
defer c.Close()
b:=make([]byte,1024)
_,e1:=c.Write([]byte("testing udp!"))
if e1 != nil {
fmt.Println("Write",e1)
return
}
l,e2:=c.Read(b)
if e2 != nil {
fmt.Println("Read",e2)
return
}
fmt.Println("server:",string(b[:l]))
}
|