猿问

向 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()

}

根据文档,在检测到第一个换行符之前仅采用第一部分,因此我相信第二条消息因此被忽略。我怎样才能阅读这两条消息?我应该更改客户端中的分隔符吗?


胡子哥哥
浏览 142回答 2
2回答

神不在的星期二

鉴于客户端发送多行,服务器应该读取多行。使用bufio.Scanner读取行:func handleRequest(conn net.Conn) {   defer conn.Close()   scanner := bufio.NewScanner(conn)   for scanner.Scan() {      fmt.Printf("Got message: %s\n", scanner.Bytes())      conn.Write([]byte("Message received."))   }   if err := scanner.Err(); err != nil {      fmt.Printf("error reading connection: %v\n", err)   }}关于代码的一些注释:为了防止资源泄漏,该函数在返回时关闭连接。扫描仪循环因读取连接错误而中断。如果错误不是 io.EOF,则该函数会记录该错误。bufio.Reader也可以用来读取行,但是 bufio.Scanner 更容易使用。

拉丁的传说

在 中handleRequest(),您调用ReadString()bufio Reader。让我们看一下文档:ReadString 读取直到输入中第一次出现 delim,返回包含分隔符之前的数据的字符串。如果 ReadString 在找到分隔符之前遇到错误,它将返回错误之前读取的数据以及错误本身(通常是 io.EOF)。当且仅当返回的数据不以 delim 结尾时,ReadString 返回 err != nil。对于简单的使用,扫描仪可能更方便。考虑到您发送的数据包以 终止,您必须在同一个读取器上\n调用两次。ReadString()您可能希望ReadString()循环调用,直到返回错误。io.EOF那么一定要分清楚。
随时随地看视频慕课网APP

相关分类

Go
我要回答