GO 编程,在 reader 事件上阻止读取函数

GO programming, blocking read function on a reader event

我是Go编程的初学者,对bufio readers的一个问题感到困惑。 我正在编写一种聊天客户端,它必须实时显示和发送我们的消息。但是直到我在我的终端中按下回车键,我收到的消息才会显示。 经过几次测试,问题似乎出在我的 "inputListener()" 函数上,因为如果我在读取来自服务器的消息后放置它,来自服务器的消息将首先显示。 我认为 Read 函数可能会阻塞我的循环,直到它得到一个 '\n' 或类似的东西。

这是我的代码:

package main
import "os"
import "strconv"
import "net"
import "bufio"

/*Recovery our input message into a buffer*/
func inputListener()([] byte){
    buf := make([]byte, 512)
    readerInput := bufio.NewReader(os.Stdin)
    _, err := readerInput.Read(buf)
    if err != nil{
        panic("Error reading input.")
        os.Exit(0)
    }
    return buf
}


func main(){
if len(os.Args) != 3{
    println("Usage: ",os.Args[0], " <host> <port>\n")
    os.Exit(0)
}

//Recovery the port.
port, err := strconv.Atoi(os.Args[2])
if err != nil{
  panic("Error during the port recovery\n")
  os.Exit(0)
}
println(port)

/*Join the adresse*/
addr := os.Args[1] + ":" + strconv.Itoa(port)
println(addr)

/*  sources -- https://golang.org/pkg/net/  */

conn, err := net.Dial("tcp", addr)
if err != nil{
    panic("Error connecting " + addr)
    os.Exit(0)
}


buf := make([]byte, 512)
t := make([]byte, 512)

for {

    /*Receive data from server*/
    size, err := conn.Read(buf)
    if err != nil {
        panic("Error reading output.")
        os.Exit(0)
    }
    if size >= 0{
        print(string(buf[0:size]))
    }

    /*Data we need to send*/
    t = inputListener()
    if len(t) >= 0{
        conn.Write(t)
    }
} 

conn.Close()
}

每收到一条消息我都需要按回车键:/

提前感谢您的回答!

你可以尝试这样的事情:

package main

import (
    "bufio"
    "io"
    "net"
    "os"
    "strconv"
)

/*Recovery our input message into a buffer*/
func inputListener() []byte {
    buf := make([]byte, 512)
    readerInput := bufio.NewReader(os.Stdin)
    _, err := readerInput.Read(buf)
    if err != nil {
        panic("Error reading input.")
    }
    return buf
}

func main() {
    if len(os.Args) != 3 {
        println("Usage: ", os.Args[0], " <host> <port>\n")
        os.Exit(0)
    }

    //Recovery the port.
    port, err := strconv.Atoi(os.Args[2])
    if err != nil {
        panic("Error during the port recovery\n")
    }
    println(port)

    /*Join the adresse*/
    addr := os.Args[1] + ":" + strconv.Itoa(port)
    println(addr)

    /*  sources -- https://golang.org/pkg/net/  */

    conn, err := net.Dial("tcp", addr)
    if err != nil {
        panic("Error connecting " + addr)
    }
    defer conn.Close()

    go io.Copy(os.Stdout, conn)

    r := bufio.NewReader(os.Stdin)
    for {
        p, err := r.ReadSlice('\n')
        if err != nil {
            panic("Error reading output.")
        }
        conn.Write(p)
    }
}