我有以下代码实现了用go编写的简单tcp聊天服务器。 我很难理解在连接中代码是通过"伙伴渠道"发送的。 我看到当第一个用户连接时,select语句只是等到下一个用户加入。 但是当第二个用户加入时,代码如何通过通道发送信息并知道选择哪种情况?
每当客户端连接时,match函数就会被调用一次。我相信这很清楚。
select语句的第一种情况希望沿伙伴通道发送TCP连接。第二种情况是希望从伙伴通道接收TCP连接。
如果准备好执行select语句的多种情况,则运行时将随机选择一个。
第一次调用match时(我们称其为M1),这两种情况都不会继续进行,因为通道没有缓冲。 M1挡住并等待。当第二次调用match(M2)时,接下来发生的事情实际上是无法预测的,但是效果是相同的。
假设M2尝试处理第一种情况,将第二个连接发送给伙伴。这将起作用,因为M1已准备好接收它。因此,M2处理第一种情况,M1处理第二种情况,并调用
现在让我们回过头来,假设M2尝试处理第二种情况,并从伙伴那里收到另一个连接。这也是可行的,因为M1准备发送第一个连接。因此,在这种情况下,M1处理第一种情况,M2处理第二种情况,并调用
因此,在两种情况下都将调用聊天,但是参数的顺序不在这种情况下,无论哪种方式都可以工作,因为通信是双向的,我们不在乎谁先到。
然后它又重新开始。