为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中写入客户端 UDP 套接字

在 Go 中写入客户端 UDP 套接字

Go
繁星coding 2021-08-16 19:56:39
我正在寻找一个很好的解决方案,用于与 Go 语言中的 UDP 套接字进行客户端/服务器通信。我在 Internet 上找到的示例向我展示了如何将数据发送到服务器,但它们没有教如何将数据发送回客户端。为了演示,我的程序执行以下操作:我的客户端程序在 4444 端口上创建了一个套接字,如下所示:con, err := net.Dial("udp", "127.0.0.1:4444")我向服务器发送了一个字符串和本地地址,因此它可以打印该字符串并发送一条 OK 消息。我为此使用 gob:enc := gob.NewEncoder(con)enc.Encode(Data{"test", con.LocalAddr().String()})我的数据结构如下所示:type Data struct{     Msg string     Addr string}我的服务器侦听 4444 端口并正确解码 Gob,但如何将 OK 消息发回?我使用客户端地址这样做(在服务器 .go 文件上):con, err := net.Dial("udp", data.Addr)然后,我收到一个错误代码:write udp 127.0.0.1:35290: connection refused当客户端尝试连接到服务器的端口 4444 时,客户端会创建一个带有随机数(在本例中为 35290)的端口,以便它们可以进行通信。我知道我不应该将客户端的地址传递给服务器,但是 conn.RemoteAddress() 不起作用。发现客户端地址的解决方案将是最受赞赏的。观察:我知道有 ReadFromUDP,所以我可以读取包。我应该阅读它,发现客户端的地址,然后将数据发送到 Gob 以便它可以解码吗?
查看完整描述

2 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

检查以下示例以了解通过 UDP 进行的客户端/服务器通信。sendResponse 例程用于将响应发送回客户端。


udpclient.go


package main

import (

    "fmt"

    "net"

    "bufio"

)


func main() {

    p :=  make([]byte, 2048)

    conn, err := net.Dial("udp", "127.0.0.1:1234")

    if err != nil {

        fmt.Printf("Some error %v", err)

        return

    }

    fmt.Fprintf(conn, "Hi UDP Server, How are you doing?")

    _, err = bufio.NewReader(conn).Read(p)

    if err == nil {

        fmt.Printf("%s\n", p)

    } else {

        fmt.Printf("Some error %v\n", err)

    }

    conn.Close()

}

udpserver.go


package main

import (

    "fmt" 

    "net"  

)



func sendResponse(conn *net.UDPConn, addr *net.UDPAddr) {

    _,err := conn.WriteToUDP([]byte("From server: Hello I got your message "), addr)

    if err != nil {

        fmt.Printf("Couldn't send response %v", err)

    }

}



func main() {

    p := make([]byte, 2048)

    addr := net.UDPAddr{

        Port: 1234,

        IP: net.ParseIP("127.0.0.1"),

    }

    ser, err := net.ListenUDP("udp", &addr)

    if err != nil {

        fmt.Printf("Some error %v\n", err)

        return

    }

    for {

        _,remoteaddr,err := ser.ReadFromUDP(p)

        fmt.Printf("Read a message from %v %s \n", remoteaddr, p)

        if err !=  nil {

            fmt.Printf("Some error  %v", err)

            continue

        }

        go sendResponse(ser, remoteaddr)

    }

}


查看完整回答
反对 回复 2021-08-16
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

hello_echo.go


 package main                                                                                                          


 import (                                                                                                              

     "bufio"                                                                                                           

     "fmt"                                                                                                             

     "net"                                                                                                             

     "time"                                                                                                            

 )                                                                                                                     


 const proto, addr = "udp", ":8888"                                                                                    


 func main() {  


     go func() {                                                                                                       

         conn, _ := net.ListenPacket(proto, addr)                                                                      

         buf := make([]byte, 1024)                                                                                     

         n, dst, _ := conn.ReadFrom(buf)                                                                               

         fmt.Println("serv recv", string(buf[:n]))                                                                     

         conn.WriteTo(buf, dst)                                                                                        

     }()        


     time.Sleep(1 * time.Second)   


     conn, _ := net.Dial(proto, addr)                                                                                  

     conn.Write([]byte("hello\n"))                                                                                     

     buf, _, _ := bufio.NewReader(conn).ReadLine()                                                                     

     fmt.Println("clnt recv", string(buf))                                                                             

 }            


查看完整回答
反对 回复 2021-08-16
  • 2 回答
  • 0 关注
  • 194 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信