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

golang tcp套接字在立即写入后不发送消息

golang tcp套接字在立即写入后不发送消息

Go
函数式编程 2021-06-10 18:13:11
我的GO版本是1.1.1服务器在连接关闭后收到消息,但设置了 NoDelay。有什么不对addr, _ := net.ResolveTCPAddr("tcp", "localhost:5432")conn, err := net.DialTCP("tcp", nil, addr)defer conn.Close()if err != nil {    fmt.Println("connect fail")    return}err = conn.SetNoDelay(true)if err != nil {    fmt.Println(err.Error())}for {    var message string    _, err := fmt.Scanln(&message)    if err != nil && err.Error() != "unexpected newline" {        fmt.Println("input finished", err)        break    }    if message == "" {        fmt.Println("no input, end")        break    }    // message = fmt.Sprintf("%s\n",message)     //fmt.Fprintf(conn, message) // send immediately but following message won't send any more    conn.Write([]byte(message)) // won't send until connection close}
查看完整描述

2 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

您的代码似乎没有任何严重错误,所以我猜测错误出在服务器端。


如果您在端口 5432 上创建本地 TCP 服务器,您可以对此进行测试。


尝试运行以下服务器代码,然后针对它测试您的客户端代码。它只是将所有接收到的数据回显到标准输出。


package main


import (

    "io"

    "log"

    "net"

    "os"

)


func main() {

    l, err := net.Listen("tcp", "localhost:5432")

    if err != nil {

        log.Fatal(err)

    }

    defer l.Close()

    for {

        conn, err := l.Accept()

        if err != nil {

            log.Fatal(err)

        }

        go func(c net.Conn) {

            defer c.Close()

            io.Copy(os.Stdout, c)

        }(conn)

    }

}

按下回车键后,您应该会看到发送到客户端的每一行都被打印出来(没有换行符)。


查看完整回答
反对 回复 2021-06-21
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

问题出在服务器端。


func handleConnection(conn net.Conn) {

// I didn't put it in for loop

message, err := bufio.NewReader(conn).ReadString('\n')

}


查看完整回答
反对 回复 2021-06-21
  • 2 回答
  • 0 关注
  • 258 浏览
慕课专栏
更多

添加回答

举报

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