0
因此,我编写了一个服务器,接收来自连接客户端的短消息,反转并封装它们并将它们发回。无法编程允许发送文本消息到服务器的客户端
现在我想编写一个客户端,这样,当我启动它,它会继续运行,直到我将它关闭(Ctrl + C),并让我输入文本行,并将它们发送到服务器。
虽然我有一个问题 - 如果我将西里尔文符号传递给输入,它将返回一个<nil> <nil>
(类型,值)错误,并且将保持窃听,除非我以某种方式刷新内存。
我也无法知道如何读取整个消息(整体意味着片的大小(1024字节))而不是单独的每个单词。
另外,我该如何计算如何延迟“输入消息”文本?根据我传递给服务器的消息长度,应等待更长或更短。如果信息被分成几条信息,我只是在接收到答案之后,我不希望它在所有地方出现。
下面是相关代码:
func client() {
// connect to the server
c, err := net.Dial("tcp", "127.0.0.1"+":"+port)
if err != nil {
log.Printf("Dial error: %T %+v", err, err)
return
}
// send the message
msg := ""
for {
fmt.Print("Enter your message:\n")
_, errs := fmt.Scan(&msg)
if errs != nil {
log.Printf("Scan error: %T %+v", errs, errs)
return
}
fmt.Println("Client sending:\n", msg)
_, errw := c.Write([]byte(msg))
if errw != nil {
log.Printf("Write error: %T %+v", errw, errw)
return
}
// handle the response
go handleServerResponse(c)
time.Sleep(1 * time.Second)
}
func main() {
port = "9999"
// launch client
done := make(chan bool)
go client()
<-done // Block forever
}
我用空信道从结束封锁的main()。
我应该如何处理上面解释的2个问题?
使用了'fmt.Scan'其扫描空间分隔值。如果您不想单独读取每个值,请不要使用它。您可以使用Scanln来读取一行,或直接从标准输入读取。 – JimB
@JimB是的,意识到这一点。但是,当我尝试输入由空格分隔的几个值时,Scanln不起作用。该函数然后返回一个零错误 - 如果我尝试向它提供西里尔字母,它的行为方式也是如此。 – Arthmost
ScanIn仍然需要与命令行上输入相同数量的参数。你没有看到任何错误,因为你正在检查'errs',但是打印'err'(总是使用相同的错误变量名来避免这种类型的错误)。您可能不需要fmt扫描功能。刚刚从标准输入读取。 – JimB