【发布时间】:2018-04-17 09:22:01
【问题描述】:
我有以下一段代码,它实现了一个用 go 编写的简单 tcp 聊天服务器。我无法理解代码中的连接是通过“合作伙伴通道”发送的。我看到当第一个用户连接时,select 语句只是等到下一个用户加入。但是当第二个用户加入时,代码如何通过通道发送信息并知道选择哪种情况?
package main
import (
"io"
"net"
"log"
"fmt"
)
const listnAddr = "localhost:4000"
func main(){
l , err := net.Listen("tcp",listnAddr)
if err != nil {
log.Fatal(err)
}
for {
c , err := l.Accept()
if c!= nil{
fmt.Printf("ok")
}
if err != nil {
log.Fatal(err)
}
go match(c)
}
}
var partner = make(chan io.ReadWriteCloser)
func match(c io.ReadWriteCloser){
fmt.Fprint(c,"waiting for a partner...")
select{
case partner <- c:
//now handled by the other goroutine
case p := <-partner:
chat(p,c)
}
fmt.Printf("waiting")
}
func chat(a, b io.ReadWriteCloser) {
fmt.Fprintln(a, "Found one! Say hi.")
fmt.Fprintln(b, "Found one! Say hi.")
go io.Copy(a, b)
io.Copy(b, a)
}
【问题讨论】: