一般的教程都是tcp,udp一起教的,学也是一起学习的,也不知道是真正的理解了会了写出来的,还是给记住了默写出来的,udp的代码实例如下:
udp server代码,udp的一点坑点吧,服务端在写数据给客户端的时候,需要使用writetoudp,这样是因为服务端接收到了很多客户端的连接,故写的时候需要指定客户端的地址,而客户端在写数据的时候,无需指定地址,因为开始连接udp的服务器后,建立的会话相对只有一个,直接write即可。
package main
import (
"fmt"
"net"
"os"
)
func serverhanderror(err error, when string) {
if err != nil {
fmt.Println(err, when)
os.Exit(1)
}
}
func main() {
udpaddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8888")
serverhanderror(err, "net.ResolveUDPAddr")
udpconn, err := net.ListenUDP("udp", udpaddr)
serverhanderror(err, " net.ListenUDP")
buffer := make([]byte, 1024)
for {
n, remoteadd, err := udpconn.ReadFromUDP(buffer)
serverhanderror(err, "udpconn.ReadFromUDP")
clientmsg := string(buffer[:n])
if clientmsg != "bye" {
fmt.Printf("服务端收到客户端%s的消息%s\n", remoteadd, clientmsg)
//udpconn.Write([]byte("服务端已收到消息:" + clientmsg))
udpconn.WriteToUDP([]byte("服务端已收到消息:"+clientmsg), remoteadd)
} else {
udpconn.Write([]byte("bye"))
udpconn.WriteToUDP([]byte("bye"), remoteadd)
fmt.Printf("客户端%s已经断开连接\n", remoteadd)
}
}
}
udp 客户端代码
package main
import (
"bufio"
"fmt"
"net"
"os"
)
func clienthanderror(err error, when string) {
if err != nil {
fmt.Println(err, when)
os.Exit(1)
}
}
func main() {
udpconn, err := net.Dial("udp", "127.0.0.1:8888")
clienthanderror(err, "net.Dial")
reader := bufio.NewReader(os.Stdin)
buffer := make([]byte, 1024)
for {
linebytes, _, err := reader.ReadLine()
clienthanderror(err, "reader.ReadLine")
n, err := udpconn.Write(linebytes)
fmt.Printf("向服务端发送%d个字节\n", n)
clienthanderror(err, "udpconn.Write")
n2, err2 := udpconn.Read(buffer)
clienthanderror(err2, "udpconn.Read")
servermsg := string(buffer[0:n2])
if servermsg != "bye" {
fmt.Println("收到服务器回复信息:", servermsg)
} else {
break
}
}
udpconn.Write([]byte("我还会回来的"))
}