enzoyang
enzoyang

Reputation: 877

golang tcp socket does not send message after write immediately

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
}

Upvotes: 5

Views: 12700

Answers (2)

enzoyang
enzoyang

Reputation: 877

the problem is on the server end.

func handleConnection(conn net.Conn) {
// I didn't put it in for loop
message, err := bufio.NewReader(conn).ReadString('\n')
}

Upvotes: 1

Intermernet
Intermernet

Reputation: 19408

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.

Upvotes: 8

Related Questions