2

我这里有这段代码

https://gist.github.com/ChasingLogic/8324442

我正在尝试使用 Golang 学习网络编程,这是我第一次尝试并发,目标相当于一个精简的 irc 服务器,在该服务器上发送消息并回显给所有连接的客户端。

出于某种原因,我的代码永远无法将数据发送到通道中。如果我在其中进行错误检查,它将无限吐出 EOF。

4

1 回答 1

3

你有两个问题:

  1. handleClient 中的空缓冲区
  2. 发送方和接收方之间的死锁

第一个很简单——只需使用“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)
于 2014-01-08T22:11:27.620 回答