数据不通过渠道发送

时间:2014-01-08 20:59:35

标签: concurrency go channel goroutine

我这里有这段代码

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

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

出于某种原因,我的代码永远不会过去将数据发送到频道。如果我在其中进行错误检查,则无限地吐出EOF。

1 个答案:

答案 0 :(得分:3)

你有两个问题:

  1. handleClient中的空buf
  2. 发件人和收件人之间的死锁
  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)