Golang udp 服务端客户端代码实例

一般的教程都是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("我还会回来的"))

}

猜你喜欢

转载自www.cnblogs.com/warrior-tian/p/12825766.html