1 回答
TA贡献1890条经验 获得超9个赞
你的con对象是一个连接,它具有Read和Write这里所描述的方法:在这里。您应该循环连接,尝试Read传入数据,然后处理它并(可能)Write返回服务器响应。(这里,bufferiopackage之类的可以帮你更方便的处理,这只是底层ReadWriter接口)
文档显示了一个小例子:
go func(c net.Conn) {
// Echo all incoming data.
io.Copy(c, c)
// Shut down the connection.
c.Close()
}(conn)
它只处理第一条消息,然后关闭。您可以像这样处理每个传入的消息:
go func(c net.Conn) {
// Infinite loop: Get data, copy them and start over
for {
// Echo all incoming data.
io.Copy(c, c)
}
// Shut down the connection.
c.Close()
}(conn)
io.Copy当然,替换与您的服务器相关的任何内容,因此您的示例将是这样的:
func handleConnection(con net.Conn) {
fmt.Println("Handling connection.")
defer func() {
// Closes the connection
con.Close()
fmt.Println("Connection closed.")
}()
var message string
// Decodes the received message
decoder := gob.NewDecoder(con)
encoder := gob.NewEncoder(con)
for {
error := decoder.Decode(&message)
// Checks for errors
if error != nil {
fmt.Println(error)
// Exit the loop
return
} else {
fmt.Println("Received", message)
// Sending back
if error = encoder.Encode(message); error != nil {
fmt.Println(error)
return
} else {
fmt.Println("Echo'd successfuly ! Waiting for next message...")
}
}
}
}
此外,您可能应该使用 packagelog而不是fmt您的日志消息(但这在这里无关紧要)。
了解这一切如何工作的一个好地方是在此处浏览默认http服务器的实现。
同样,您的客户端应该使用相同的模式循环:
LOOP:
Send data (e.g. encoder.Encode)
Receive data (e.g. decoder.Decode)
if problem or termination -> break out of loop
END
close connection
- 1 回答
- 0 关注
- 164 浏览
添加回答
举报