Go 多端口连接的UDP服务器问题

Go 多端口连接的UDP服务器问题,go,networking,udp,Go,Networking,Udp,我有一个UDP服务器,它公开两个端口,8080用于正常数据,8082用于控制(保持活动信号)。当我启动服务器时,会创建一个新的服务器实例。它有一个客户机列表:客户机由一个结构表示,该结构包含两种类型的UDPConn,一种用于控制,另一种用于数据。当我运行我的客户端时会发生什么情况。go我在两个端口都连接到服务器,但是服务器创建了两个客户端而不是一个。向下是我的服务器.go和客户端.go的一部分。如何为两个连接只创建一个用户 Server.go func main(){ 服务器:=newlobb(

我有一个UDP服务器,它公开两个端口,8080用于正常数据,8082用于控制(保持活动信号)。当我启动服务器时,会创建一个新的服务器实例。它有一个客户机列表:客户机由一个
结构表示,该结构包含两种类型的
UDPConn
,一种用于控制,另一种用于数据。当我运行我的
客户端时会发生什么情况。go
我在两个端口都连接到服务器,但是服务器创建了两个客户端而不是一个。向下是我的
服务器.go
客户端.go
的一部分。如何为两个连接只创建一个用户

Server.go

func main(){
服务器:=newlobb()
addressCntrl,err:=net.ResolveUDPAddr(连接类型,连接端口)
如果错误!=零{
log.Fatalf(“错误解析控制器地址:%s”,错误)
}
listenerCntrl,err:=net.ListenUDP(连接类型,地址Cntrl)
延迟listenerCntrl.Close()
log.Printf(“端口%s上的侦听控制”,连接端口)
addressData,err:=net.ResolveUDPAddr(连接类型,连接数据端口)
如果错误!=零{
log.Fatalf(“解析数据地址%s时出错”,错误)
}
listenerData,err:=net.ListenUDP(连接类型,地址数据)
延迟listenerData.Close()
log.Printf(“侦听端口%s上的数据”,连接数据端口)
为了{
缓冲区=生成([]字节,1024)
listenerData.ReadFromUDP(缓冲区)
c:=NewClient(*listenerData,*listenerCntrl)
服务器连接(c)
}
}
新闻服务器(server.go)

func NewServer()*服务器{
服务器:=&服务器{
客户机:make([]*客户机,0),
聊天室:make(映射[字符串]*聊天室),
传入:生成(chan*消息),
加入:make(chan*客户),
离开:make(chan*客户),
删除:make(chan*聊天室),
}
server.Listen()
返回服务器
}
新客户端(server.go)

func新客户端(conndat net.UDPConn,connctrl net.UDPConn)*Client{
writerData:=bufio.NewWriter(&connData)
readerData:=bufio.NewReader(&connData)
writerCntrl:=bufio.NewWriter(&connctrl)
readerCtrl:=bufio.NewReader(&connctrl)
客户端:=&客户端{
名称:客户名称,
聊天室:无,
传入:生成(chan*消息),
传出:make(chan string),
connData:connData,
connCntrl:connCntrl,
readerData:readerData,
writerData:writerData,
ReaderCtrl:ReaderCtrl,
WriterCentrl:WriterCentrl,
}
log.Printf(“新连接的客户端”)
client.Listen()
返回客户端
}
客户机,开始

func main(){
服务器:=新闻服务器()
addressCntrl,err:=net.ResolveUDPAddr(连接类型,连接端口)
如果错误!=零{
log.Fatalf(“错误解析控制器地址:%s”,错误)
}
listenerCntrl,err:=net.ListenUDP(连接类型,地址Cntrl)
延迟listenerCntrl.Close()
log.Printf(“端口%s上的侦听控制”,连接端口)
addressData,err:=net.ResolveUDPAddr(连接类型,连接数据端口)
如果错误!=零{
log.Fatalf(“解析数据地址%s时出错”,错误)
}
listenerData,err:=net.ListenUDP(连接类型,地址数据)
延迟listenerData.Close()
log.Printf(“侦听端口%s上的数据”,连接数据端口)
为了{
缓冲区=生成([]字节,1024)
listenerData.ReadFromUDP(缓冲区)
c:=NewClient(*listenerData,*listenerCntrl)
服务器连接(c)
}
}
下面是输出的一个示例

服务器输出

2021/05/06 20:03:52 Listening controll on port :8082
2021/05/06 20:03:52 Listening data on port :8080
2021/05/06 20:03:56 New client connected
2021/05/06 20:03:58 New client connected
客户端输出

Welcome to the server! Type "/help" to get a list of commands.
Welcome to the server! Type "/help" to get a list of commands.
如果需要,我的客户端函数
Read()
Write()
如下所示

读(client.go)

func读取(connData net.UDPConn,connctrl net.UDPConn){
//控制器
go func(){
readerCtrl:=bufio.NewReader(&connctrl)
为了{
str,uDCTRL:=readerCtrl.ReadString('\n')
if strings.Compare(str,“timeout”)==0{
操作系统退出(1)
}
}
}()
//资料
读卡器:=bufio.NewReader(&connData)
为了{
str,err:=reader.ReadString('\n')
如果错误!=零{
fmt.Printf(消息断开)
wg.Done()
返回
}
格式打印(str)
}
}
写入(client.go)

func写入(connData net.UDPConn,connctrl net.UDPConn){
//控制器
go func(){
writerCntrl:=bufio.NewWriter(&connctrl)
范围时间。勾选(10*时间秒){
WriterCentrl.WriteString(“ka”)
}
}()
//资料
reader:=bufio.NewReader(os.Stdin)
writerData:=bufio.NewWriter(&connData)
为了{
输入,错误:=reader.ReadString('\n')
如果错误!=零{
log.Fatalf(“读取输入时出错:%s”,错误)
}
_,err=writerData.WriteString(输入)
如果错误!=零{
log.Fatalf(“向服务器写入输入时出错:%s”,错误)
}
err=writerData.Flush()
如果错误!=零{
log.Fatalf(“刷新输入%s时出错”,错误)
wg.Done()
}
}
}

这里有点混乱,客户端中使用的读写函数在哪里?另外,你能把
NewServer
newlobb
功能放进去吗?另外,请检查你是否为客户端显示了正确的代码。转到这里。看起来您的客户端正在创建另一个UDP服务器,而不是连接到该服务器。@advayrajansa我做了更改,看看是否更容易理解