向TCP服务器发送多个请求失败

时间:2019-07-28 12:28:32

标签: go tcp

我正在尝试向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()
}

根据文档,仅在检测到第一个换行符之前才使用第一部分,因此我相信因此会忽略第二条消息。如何阅读两条消息?我应该在客户端更改定界符吗?

2 个答案:

答案 0 :(得分:1)

假设客户端发送多行,则服务器应读取多行。使用bufio.Scanner读取行:

b

有关代码的一些注释:

  • 为防止资源泄漏,该函数在返回时关闭连接。
  • 由于读取连接错误而导致扫描程序循环中断。如果错误不是io.EOF,则该函数记录错误。
  • 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套接字,因此您必须在其他地方运行它。