go - 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 键:/
预先感谢您的回答!
解决方案
你可以尝试这样的事情:
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)
}
}
推荐阅读
- css - 悬停在一个 div 上会点亮另一个对应的
- javascript - 为什么俄罗斯方块会一次全部掉落而不是一次掉落?
- flutter - 异步方法在颤动中返回null
- graphql - GraphQL 查询返回 null。不知道为什么
- java - 如何将我的 while 循环转换为 for 循环?
- flutter - 有没有办法配置 willPopScope 来捕捉自定义弹出导航?
- sql-server - 表上 3 个月的滚动平均值
- python - PyTorch 训练了哪些 ImageNet 类?
- mysql - MariaDB - 使用 CAST 准备语句时的行为不一致
- php - PHP脚本循环字符串