我正在尝试向Go中的TCP服务器发送多个请求,但是由于某种原因,即使与第一个请求相同,也不会发送第二个请求。
这是服务器:
func StartServer(host string) {
l, err := net.Listen("tcp", host)
log.Println("Starting server on:", host)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer l.Close()
log.Println("Server is running...")
for {
// Listen for an incoming connection.
conn, err := l.Accept()
if err != nil {
log.Fatal("Error accepting: ", err.Error())
}
// Handle connections in a new goroutine.
fmt.Println("got a request")
go handleRequest(conn)
}
}
这是客户端中将请求发送到服务器的功能:
func (u *User) ConnectToServer(host string, partner string) {
conn, _ := net.Dial("tcp", host)
fmt.Fprintf(conn, "message1\n")
fmt.Fprintf(conn, "message2\n")
}
编辑:在handleRequest函数中,我读取的输入如下:
// Handles incoming requests.
func handleRequest(conn net.Conn) {
rec, err := bufio.NewReader(conn).ReadString('\n')
if err != nil {
log.Println("Error reading:", err.Error())
}
log.Println("Got message: ", rec)
// Send a response back to person contacting us.
conn.Write([]byte("Message received."))
// conn.Close()
}
根据文档,仅在检测到第一个换行符之前才使用第一部分,因此我相信因此会忽略第二条消息。如何阅读两条消息?我应该在客户端更改定界符吗?
答案 0 :(得分:1)
假设客户端发送多行,则服务器应读取多行。使用bufio.Scanner读取行:
b
有关代码的一些注释:
malloc
也可以用来读取行,但是bufio.Scanner更易于使用。答案 1 :(得分:0)
在handleRequest()
中,您在bufio Reader上调用ReadString()
。让我们看一下docs:
ReadString读取直到输入中第一次出现delim为止, 返回一个字符串,该字符串包含直至(包括) 定界符。如果ReadString在找到 定界符,它返回错误之前读取的数据和错误 本身(通常为EOF)。当且仅当ReadString返回err!= nil 返回的数据不以delim结尾。为了简单使用,请使用扫描仪 可能更方便。
考虑到您发送的数据包被\n
终止,您必须在同一读取器上两次调用ReadString()
。您可能想循环调用ReadString()
,直到返回错误。然后,请确保区分io.EOF
。
这是一个playground,有一些启发。注意:看来游乐场不允许使用TCP套接字,因此您必须在其他地方运行它。