Go语言实现UDP版聊天小工具的示例详解

要看tcp版的小伙伴请移步:聊天小工具tcp版本

udp版本和tcp版本很像,都是分为server端和client端,具体代码如下

代码实现

server.go

  1. package main
  2. import (
  3.      “bufio”
  4.      “fmt”
  5.      “io”
  6.      “net”
  7.      “os”
  8.      “strings”
  9. )
  10. // 监听UDP协议进行通信
  11. func main() {
  12.      // 建通udp端口, 传入协议名称与,UDPAddr类型的地址与端口
  13.      listen, err := net.ListenUDP(“udp”, &net.UDPAddr{
  14.          IP: net.IPv4(127, 0, 0, 1),
  15.          Port: 10000,
  16.      })
  17.      if err != nil {
  18.          fmt.Println(“listen udp port failed err:”, err)
  19.          return
  20.      }
  21.      // 函数结束关闭连接
  22.      defer listen.Close()
  23.      // 发送与接受数据
  24.      for {
  25.          var baby [1024]byte
  26.          reader := bufio.NewReader(os.Stdin)
  27.          // 接受数据,传入切片类型对象,baby[:]表示切片类型吗,返回字节数与发送端地址与错误信息
  28.          n, addr, err := listen.ReadFromUDP(baby[:])
  29.          if err == io.EOF {
  30.              fmt.Println(“read ok, “, err)
  31.              continue
  32.          }
  33.          if err != nil {
  34.              fmt.Println(“read data failed, err:”, err)
  35.              continue
  36.          }
  37.          fmt.Printf(“Client:%v, remoteaddr:%v bytes:%v\n”, string(baby[:n]), addr, n)
  38.          // 发送数据
  39.          fmt.Print(“Server:”)
  40.          // 对输入对内容进行格式输出,对特殊字符进行转义,传入的字节返回的字符串
  41.          text, _ := reader.ReadString(‘\n’)
  42.          // 去掉开头或结尾的空格
  43.          msg := strings.TrimSpace(text)
  44.          _, err = listen.WriteToUDP([]byte(msg), addr)
  45.          if err != nil {
  46.              fmt.Println(“write to udp failed, err:”, err)
  47.              continue
  48.          }
  49.      }
  50. }

client.go

  1. package main
  2. import (
  3.      “bufio”
  4.      “fmt”
  5.      “net”
  6.      “os”
  7.      “strings”
  8. )
  9. func main() {
  10.      // 与远端udp进行通信, 传入协议名称与,UDPAddr类型的地址与端口
  11.      listen, err := net.DialUDP(“udp”, nil, &net.UDPAddr{
  12.          IP: net.IPv4(127, 0, 0, 1),
  13.          Port: 10000,
  14.      })
  15. if err != nil {
  16.          fmt.Println(“connection udp port failed,err:”, err)
  17.          return
  18.      }
  19.      // 函数结束关闭连接
  20.      defer listen.Close()
  21.      // 发送与接受数据
  22.      var baby [1024]byte
  23.      for {
  24.          // 发送数据
  25.          fmt.Print(“Client:”)
  26.          reader := bufio.NewReader(os.Stdin)
  27.          text, _ := reader.ReadString(n’)
  28.          // 去掉开头或结尾的空格
  29.          msg := strings.TrimSpace(text)
  30.          if msg == “exit” {
  31.              return
  32.          }
  33.          _, err = listen.Write([]byte(msg))
  34.          if err != nil {
  35.              fmt.Println(“发送数据失败,err:”, err)
  36.              return
  37.          }
  38.          // 接受数据
  39.          n, desaddr, err := listen.ReadFromUDP(baby[:])
  40.          if err != nil {
  41.              fmt.Println(“接收数据失败,err:”, err)
  42.              return
  43.          }
  44.          fmt.Printf(“Server:%v remoteaddr:%v bytes:%v\n”, string(baby[:n]), desaddr, n)
  45.      }
  46. }

运行效果

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

到此这篇关于Go语言实现UDP版聊天小工具的示例详解的文章就介绍到这了,更多相关Go语言聊天工具内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

标签

发表评论