GO编程,阻止读卡器事件上的读取功能

GO编程,阻止读卡器事件上的读取功能,go,networking,chat,Go,Networking,Chat,我是Go编程的初学者,我对bufio阅读器的一个问题感到困惑。 我正在编写一种聊天客户端,它必须实时显示和发送我们的消息。但直到我在终端中按enter键,我收到的消息才会显示。 经过几次测试后,问题似乎出在我的“inputListener()”函数上,因为如果我在从服务器读取消息后放置它,则首先显示来自服务器的消息。 我认为Read函数可能会阻塞我的循环,直到它得到一个“\n”或类似的值 这是我的密码: package main import "os" import "strconv" impo

我是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()
}
主程序包
导入“操作系统”
导入“strconv”
进口“净”
输入“bufio”
/*将输入消息恢复到缓冲区中*/
func inputListener()([]字节){
buf:=make([]字节,512)
readerInput:=bufio.NewReader(os.Stdin)
_,err:=readerInput.Read(buf)
如果错误!=零{
死机(“读取输入时出错”)
操作系统退出(0)
}
返回buf
}
func main(){
如果len(os.Args)!=3{
println(“用法:”,os.Args[0],“\n”)
操作系统退出(0)
}
//恢复端口。
端口,错误:=strconv.Atoi(os.Args[2])
如果错误!=零{
死机(“端口恢复期间出错\n”)
操作系统退出(0)
}
println(端口)
/*加入地址*/
地址:=os.Args[1]+“:”+strconv.Itoa(端口)
println(addr)
/*来源--https://golang.org/pkg/net/  */
连接,错误:=网络拨号(“tcp”,地址)
如果错误!=零{
死机(“连接错误”+addr)
操作系统退出(0)
}
buf:=make([]字节,512)
t:=make([]字节,512)
为了{
/*从服务器接收数据*/
大小,错误:=conn.Read(buf)
如果错误!=零{
死机(“读取输出时出错”)
操作系统退出(0)
}
如果大小>=0{
打印(字符串(buf[0:大小])
}
/*我们需要发送的数据*/
t=inputListener()
如果len(t)>=0{
控制写入(t)
}
} 
康涅狄格州关闭
}
我需要按enter键接收每封邮件:/


提前感谢您的回答

您可以尝试以下方法:

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)
    }
}
主程序包
进口(
“布菲奥”
“io”
“净额”
“操作系统”
“strconv”
)
/*将输入消息恢复到缓冲区中*/
func inputListener()[]字节{
buf:=make([]字节,512)
readerInput:=bufio.NewReader(os.Stdin)
_,err:=readerInput.Read(buf)
如果错误!=零{
死机(“读取输入时出错”)
}
返回buf
}
func main(){
如果len(os.Args)!=3{
println(“用法:”,os.Args[0],“\n”)
操作系统退出(0)
}
//恢复端口。
端口,错误:=strconv.Atoi(os.Args[2])
如果错误!=零{
死机(“端口恢复期间出错\n”)
}
println(端口)
/*加入地址*/
地址:=os.Args[1]+“:”+strconv.Itoa(端口)
println(addr)
/*来源--https://golang.org/pkg/net/  */
连接,错误:=网络拨号(“tcp”,地址)
如果错误!=零{
死机(“连接错误”+addr)
}
延迟连接关闭()
转到io.Copy(操作系统,康涅狄格州)
r:=bufio.NewReader(os.Stdin)
为了{
p、 错误:=r.ReadSlice('\n')
如果错误!=零{
死机(“读取输出时出错”)
}
控制写入(p)
}
}

问题是什么?关于代码的注释:由于len(slice)总是大于零,所以不需要进行一些测试;没有必要调用os.Exit,在恐慌之后;由于
inputListener
丢弃bufio.Reader,程序可能会丢失输入数据。谢谢您的回复!问题是,是否有其他方法将数据从服务器捕获到缓冲区,因为这些行:
readerInput:=bufio.NewReader(os.Stdin)\uErr:=readerInput.Read(buf)
似乎在我按Enter键之前阻止了我的循环。这是有问题的,因为在这种情况下,它是一个实时聊天。(如果不清楚,请原谅,我将从Go和Networking两个方面开始)。谢谢,3t13nne。哎呀,len(slice)总是大于或等于零。它工作得非常好!但是如果我不打扰你,我仍然没有什么问题,为什么我更喜欢使用延迟来代替在程序结束时关闭协议?io之前的“go”是什么意思?收到了吗?我应该不使用Read()函数吗?谢谢