要看tcp版的小伙伴请移步:聊天小工具tcp版本
udp版本和tcp版本很像,都是分为server端和client端,具体代码如下
代码实现
server.go
package main
import (
"bufio"
"fmt"
"io"
"net"
"os"
"strings"
)
// 监听UDP协议进行通信
func main() {
// 建通udp端口, 传入协议名称与,UDPAddr类型的地址与端口
listen, err := net.ListenUDP("udp", &net.UDPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: 10000,
})
if err != nil {
fmt.Println("listen udp port failed err:", err)
return
}
// 函数结束关闭连接
defer listen.Close()
// 发送与接受数据
for {
var baby [1024]byte
reader := bufio.NewReader(os.Stdin)
// 接受数据,传入切片类型对象,baby[:]表示切片类型吗,返回字节数与发送端地址与错误信息
n, addr, err := listen.ReadFromUDP(baby[:])
if err == io.EOF {
fmt.Println("read ok, ", err)
continue
}
if err != nil {
fmt.Println("read data failed, err:", err)
continue
}
fmt.Printf("Client:%v, remoteaddr:%v bytes:%v\n", string(baby[:n]), addr, n)
// 发送数据
fmt.Print("Server:")
// 对输入对内容进行格式输出,对特殊字符进行转义,传入的字节返回的字符串
text, _ := reader.ReadString('\n')
// 去掉开头或结尾的空格
msg := strings.TrimSpace(text)
_, err = listen.WriteToUDP([]byte(msg), addr)
if err != nil {
fmt.Println("write to udp failed, err:", err)
continue
}
}
}
client.go
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
func main() {
// 与远端udp进行通信, 传入协议名称与,UDPAddr类型的地址与端口
listen, err := net.DialUDP("udp", nil, &net.UDPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: 10000,
})
if err != nil {
fmt.Println("connection udp port failed,err:", err)
return
}
// 函数结束关闭连接
defer listen.Close()
// 发送与接受数据
var baby [1024]byte
for {
// 发送数据
fmt.Print("Client:")
reader := bufio.NewReader(os.Stdin)
text, _ := reader.ReadString('\n')
// 去掉开头或结尾的空格
msg := strings.TrimSpace(text)
if msg == "exit" {
return
}
_, err = listen.Write([]byte(msg))
if err != nil {
fmt.Println("发送数据失败,err:", err)
return
}
// 接受数据
n, desaddr, err := listen.ReadFromUDP(baby[:])
if err != nil {
fmt.Println("接收数据失败,err:", err)
return
}
fmt.Printf("Server:%v remoteaddr:%v bytes:%v\n", string(baby[:n]), desaddr, n)
}
}
运行效果
D:\Software\godata\src\0115\demo\client>go run main.go
Client:你好
Server:滚 remoteaddr:127.0.0.1:10000 bytes:3
Client:好的
Server:..... remoteaddr:127.0.0.1:10000 bytes:5
Client:exit