gpt4 book ai didi

golang udp客户端无法从服务器接收消息

转载 作者:数据小太阳 更新时间:2023-10-29 03:34:46 27 4
gpt4 key购买 nike

我可以成功地从客户端向服务器发送消息。但是当我尝试回复消息给客户端时,客户端却无法接收到消息。

客户:

conn, _:= net.Dial("udp", serv_addr:port)
defer conn.close()
buf:= []byte("Hey, server")
conn.Write(buf)

recv:= make([]byte, 1024)
fmt.Println("Reading...\n")
conn.Read(recv)

服务器:

addr, _:= net.ResolveUDPAddr("udp", addr:port)
msg := make([]byte, 1024)

conn,_: net.ListenUDP("udp", addr)
_, ret_addr, _: conn.ReadFromUDP(msg)
//print msg
conn.WriteToUDP([]byte("got your msg", ret)

这是一个非常简单的udp 连接。服务器可以从客户端打印出消息,但在客户端,它在服务器完成其任务时一直在 conn.read() 之前等待。

我关注了this文章。我的实现几乎相同。

最佳答案

这是供您试用的最少代码。

在一个终端中启动服务器部分:

go run main.go server :53033

在另一个终端启动客户端:

go run main.go client :53033

现在在客户端 终端输入消息,您应该会看到客户端和服务器都在交换消息。您可以启动多个客户端(在新的终端窗口中)并与同一服务器通信。

package main

import (
"bufio"
"fmt"
"io"
"log"
"net"
"os"
)

func server(url string) {
log.Printf("serving on %s\n", url)
addr, err := net.ResolveUDPAddr("udp", url)
errcheck(err)

conn, err := net.ListenUDP("udp", addr)
errcheck(err)
defer close(conn)

msg := make([]byte, 1024)

for {
n, retAddr, err := conn.ReadFromUDP(msg)
errcheck(err)

log.Printf("received %v bytes, ret addr %v, msg %s", n, retAddr, string(msg[:n]))

reply := []byte(fmt.Sprintf("received from you: %v bytes", n))
n, err = conn.WriteToUDP(reply, retAddr)
errcheck(err)

log.Printf("sent reply %v bytes\n", n)
}
}

func client(url string) {
log.Printf("client for server url: %s\n", url)

addr, err := net.ResolveUDPAddr("udp", url)
errcheck(err)

conn, err := net.DialUDP("udp", nil, addr)
errcheck(err)
defer close(conn)

msg := make([]byte, 512)
scanner := bufio.NewScanner(os.Stdin)
for {
if scanner.Scan() {
line := scanner.Text()

n, err := conn.Write([]byte(line))
errcheck(err)
log.Printf("sent %d bytes \n", n)

n, err = conn.Read(msg)
errcheck(err)
log.Printf("server replied with: %s \n", string(msg[:n]))
}
}
}

func main() {
args := os.Args[1:]

if len(args) < 2 {
log.Fatal("expecting 2 arguments client or server first followed by the address:port")
}

switch args[0] {
case "server":
server(args[1])

case "client":
client(args[1])

default:
log.Fatal("first argument must be server or client")
}

}

func errcheck(err error) {
if err != nil {
log.Fatal(err)
}
}

func close(c io.Closer) {
err := c.Close()
if err != nil {
log.Fatal()
}
}

玩得开心!

关于golang udp客户端无法从服务器接收消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47280837/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com