为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
胡子哥哥 2023-07-10 10:52:31
我试图向 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 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

鉴于客户端发送多行,服务器应该读取多行。使用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 更容易使用。


查看完整回答
反对 回复 2023-07-10
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

在 中handleRequest(),您调用ReadString()bufio Reader。让我们看一下文档:

ReadString 读取直到输入中第一次出现 delim,返回包含分隔符之前的数据的字符串。如果 ReadString 在找到分隔符之前遇到错误,它将返回错误之前读取的数据以及错误本身(通常是 io.EOF)。当且仅当返回的数据不以 delim 结尾时,ReadString 返回 err != nil。对于简单的使用,扫描仪可能更方便。

考虑到您发送的数据包以 终止,您必须在同一个读取器上\n调用两次。ReadString()您可能希望ReadString()循环调用,直到返回错误。io.EOF那么一定要分清楚。

查看完整回答
反对 回复 2023-07-10
  • 2 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信