我可以成功地将msg从客户端发送到服务器。但是当我尝试将消息回复给客户端时,客户端无法接收消息。
客户端:
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连接。服务器可以从客户端打印出msg,但在客户端,它在服务器完成任务时在conn.read()之前一直等待。
我关注this文章。我的实现几乎完全相同。
答案 0 :(得分:1)
以下是您可以使用的最低代码。
在一个终端中启动服务器部分:
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()
}
}
玩得开心!