我这里有这段代码
https://gist.github.com/ChasingLogic/8324442
我正在尝试使用Golang学习网络编程这是我第一次尝试并发,目标是相当于一个精简的irc服务器,其中一条消息被发送并回显给所有连接的客户端。
出于某种原因,我的代码永远不会过去将数据发送到频道。如果我在其中进行错误检查,则无限地吐出EOF。
答案 0 :(得分:3)
你有两个问题:
第一个很简单 - 只需使用“buf:= make([] byte,1024)”而不是“var buf [] byte”。
第二个更详细。
在handleClient中你有
fmt.Println(string(buf[0:n]))
mesg <- buf[0:n]
fmt.Println(mesg)
ind <- n
fmt.Println(ind)
所以你首先发送消息然后 - 消息长度。但在接收方,你有:
n := <-ind
fmt.Println("N recieved")
buf := <-mesg
fmt.Println("Channels recieved")
所以你期望消息本身之前的消息长度。因此存在死锁:发送方在发送长度之前正在等待某人接收消息,但接收方在接收消息之前正等待接收消息长度。
只需更改handleClient以使其具有相反的顺序,它将起作用:
fmt.Println(string(buf[0:n]))
ind <- n
mesg <- buf[0:n]
fmt.Println(mesg)
fmt.Println(ind)