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

GO编程,在阅读器事件上阻止读取功能

GO编程,在阅读器事件上阻止读取功能

Go
开满天机 2023-06-12 09:58:33
我是 Go 编程的初学者,我对 bufio 读者的问题感到困惑。我正在编写一种聊天客户端,它必须实时显示和发送我们的消息。但是直到我在我的终端中按下回车键,我收到的消息才会显示。经过几次测试,问题似乎出在我的“inputListener()”函数上,因为如果我在读取来自服务器的消息后放置它,来自服务器的消息将首先显示。我认为 Read 函数可能会阻塞我的循环,直到它得到一个 '\n' 或类似的东西。这是我的代码:package mainimport "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()}我需要按收到的每条消息回车:/预先感谢您的回答!
查看完整描述

1 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

你可以尝试这样的事情:


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)

    }

}


查看完整回答
反对 回复 2023-06-12
  • 1 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

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