golang tcp socket在立即写入后不会发送消息 [英] golang tcp socket does not send message after write immediately

查看:848
本文介绍了golang tcp socket在立即写入后不会发送消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的GO版本是1.1.1



服务器在连接关闭后收到消息,但设置了NoDelay。



有什么不对的

  addr,_:= net.ResolveTCPAddr(tcp,localhost:5432) 
conn,err:= net.DialTCP(tcp,nil,addr)
推迟conn.Close()
if err!= nil {
fmt.Println(连接失败)
返回
}
err = conn.SetNoDelay(true)
if err!= nil {
fmt.Println(err.Error())

为{
var message string
_,err:= fmt.Scanln(& message)
if err!= nil& &安培; err.Error()!=意外换行{
fmt.Println(输入完成,err)
break
}

if message == {
fmt.Println(no input,end)
break
}
// message = fmt.Sprintf(%s \ n,message)
//fmt.Fprintf(conn,message)//立即发送,但是下面的消息不会再发送
conn.Write([] byte(message))//直到连接关闭才会发送
}


解决方案

如果你在端口5432上创建一个本地TCP服务器,你可以测试它。如果你在端口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)
}
}

只要您按回车键,您应该会看到打印出的每一行(不带换行符)。 / p>

My GO version is 1.1.1

the sever recieved messages after connection close, but NoDelay was setted.

Is there something wrong

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
}

解决方案

There doesn't seem to be anything vitally wrong with your code so I'm guessing the error is on the server end.

If you create a local TCP server on port 5432 you can test this.

Try running the below server code and then test your client code against it. It just echos all received data to stdout.

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)
    }
}

You should see each line sent to the client printed (without the newline) as soon as you hit enter.

这篇关于golang tcp socket在立即写入后不会发送消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆