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