我这里有这段代码
https://gist.github.com/ChasingLogic/8324442
我正在尝试使用 Golang 学习网络编程,这是我第一次尝试并发,目标相当于一个精简的 irc 服务器,在该服务器上发送消息并回显给所有连接的客户端。
出于某种原因,我的代码永远无法将数据发送到通道中。如果我在其中进行错误检查,它将无限吐出 EOF。
我这里有这段代码
https://gist.github.com/ChasingLogic/8324442
我正在尝试使用 Golang 学习网络编程,这是我第一次尝试并发,目标相当于一个精简的 irc 服务器,在该服务器上发送消息并回显给所有连接的客户端。
出于某种原因,我的代码永远无法将数据发送到通道中。如果我在其中进行错误检查,它将无限吐出 EOF。
你有两个问题:
第一个很简单——只需使用“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)