假设我们有以下抽象的服务器(XMPP,但在这里并不是很重要):
type Server struct {
Addr string
Conn net.Conn
tlsCon *tls.Conn
R *bufio.Reader
SSL bool
reader chan string
}
还需要一个初始化它的辅助函数:
func createServer(domain string) (s *Server, err error) {
conn, err := net.Dial("tcp", domain+":5222")
if err != nil {
return nil, err
}
s = &Server{domain, conn, nil, bufio.NewReader(conn), false, make(chan string, 8)}
go func(t *Server) {
for {
buf := bufsPool.Get().([]byte)
n, err := s.R.Read(buf)
if err == nil {
s.reader <- string(buf[:n])
} else {
fmt.Println(err)
}
}
}(s)
return s, err
}
这个想法很简单:创建一个连接,如果一切顺利,就为它获取一个缓冲读取器(我不使用conn.read函数,因为如果服务器需要,我会启动TLS连接并重新分配R以基于它创建的读取器,但现在不是这种情况)。
现在我们有了两个函数:write和read:
func (s *Server) read() (t string) {
t = ""
Inn:
for {
select {
case u := <-s.reader:
fmt.Println("debug", u)
t += u
default:
break Inn
}
}
return t
}
我希望read函数能够接收从socket读取数据的goroutine(在createServer()中启动)通过chan发送的数据。这个想法是调用write,然后读取响应。我创建了所有这些,因为服务器有时会将响应作为两部分发送,例如,我必须传统地进行两次read()。 但是这并没有起作用,我的read函数(见上文)根本没有返回任何内容。最有可能的情况是,服务器无法发送回数据,而我的函数因chan中没有内容而退出。但一个问题是,尽管我多次调用write和read,但read始终返回空值。
所以我猜我有一些通用的设计错误,问题是社区是否能够帮助我找到它。谢谢。