首页 > 解决方案 > GO编程,在阅读器事件上阻塞读取功能

问题描述

我是 Go 编程的初学者,我对有关 bufio 阅读器的问题感到困惑。我正在编写一种聊天客户端,它必须实时显示和发送我们的消息。但是,直到我在终端中按 Enter 后,我收到的消息才会显示。经过几次测试,问题似乎是我的“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()
}

每收到一条消息,我都需要按 Enter 键:/

预先感谢您的回答!

标签: gonetworkingchat

解决方案


你可以尝试这样的事情:

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

推荐阅读