Concurrency 数据未通过通道发送

Concurrency 数据未通过通道发送,concurrency,go,channel,goroutine,Concurrency,Go,Channel,Goroutine,我这里有这个密码 我正在尝试学习Golang的网络编程这是我第一次尝试并发,目标相当于一个精简的irc服务器,其中消息被发送并回显到所有连接的客户端 由于某些原因,我的代码从未通过将数据发送到通道。如果我把一个错误检查放进去,它只会无限地吐出EOF。你有两个问题: handleClient中的空buf 发送方和接收方之间的死锁 第一个很简单-只需使用“buf:=make([]byte,1024)”而不是“var buf[]byte” 第二个更详细 在你的手提电话里 fmt.Println(st

我这里有这个密码

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

由于某些原因,我的代码从未通过将数据发送到通道。如果我把一个错误检查放进去,它只会无限地吐出EOF。

你有两个问题:

  • handleClient中的空buf
  • 发送方和接收方之间的死锁
  • 第一个很简单-只需使用“buf:=make([]byte,1024)”而不是“var buf[]byte”

    第二个更详细

    在你的手提电话里

    fmt.Println(string(buf[0:n]))
    mesg <- buf[0:n]
    fmt.Println(mesg)
    ind <- n 
    fmt.Println(ind)
    
    fmt.Println(字符串(buf[0:n]))
    
    mesg如果buf为空,那么应该怎么做?看来你从来没有真正地在你的频道上做宣传。对不起,我不太明白你的意思。我以为康妮·里德会一直封锁直到数据被发送?也不确定填充我的频道意味着什么。我搜索了godoc并进行了有效的处理,但没有找到任何结果。@ChasingLogic他的意思是“var buf[]byte”导致buf为空片。试试“buf:=make([]字节,1024)”吧。@kluig我现在觉得很笨,谢谢。我确实做了那个改变,但它仍然不会通过渠道传播。感觉真的很傻。非常感谢。@ChasingLogic没问题,这就是我们学习的方式:)顺便说一句,您根本不需要消息长度通道,切片结构中已经有了长度。请注意并发性问题——您有一个资源(缓冲区)在多个并发goroutine(一个发送和多个接收)之间共享。“mesg-oh,而且只有一个客户端会收到发送的消息,因为所有客户端都被阻止在”buf:=是的,我通过创建一个客户端结构修复了这个问题(因此我也可以为它们保存一个用户名)然后每次它们连接时,我将它们添加到一个名为clients的包级数组中,并且我只运行一次sendmessage go例程,而不是每次连接都运行一次。现在,当消息在通道上发送时,send message unblocks将循环通过客户端切片写入每个客户端。
    n := <-ind
    fmt.Println("N recieved")
    buf := <-mesg
    fmt.Println("Channels recieved")
    
    fmt.Println(string(buf[0:n]))
    ind <- n
    mesg <- buf[0:n]
    fmt.Println(mesg)
    fmt.Println(ind)