无法编程允许向服务器发送文本消息的客​​户端

时间:2016-07-07 14:37:58

标签: go

所以我编写了一个服务器,它接收来自连接客户端的短信,对其进行反转和限制并将其发回。

现在我正在尝试对客户端进行编程,这样当我启动它时它会一直运行直到我关闭它(ctrl + c)并允许我输入文本行并将它们发送到服务器。

我遇到了一个问题 - 如果我将一个,例如,西里尔符号传递给输入,它将返回<nil> <nil>(类型,值)错误,并且除非我以某种方式刷新内存,否则将保持错误。

我也无法计算如何读取整个信息(整个意思是切片的大小(1024字节)),而不是分别读取每个字。

此外,我如何弄清楚如何延迟输入您的信息&#39;文本?根据我传递给服务器的消息长度,它应该等待更长或更短。如果邮件被分成几条消息,我不希望它在整个地方弹出,只是在收到答案后一次。

以下是相关代码:

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()结束。

我应该如何处理上述两个问题?

1 个答案:

答案 0 :(得分:0)

@JimB回答的问题:

  

您正在使用fmt.Scan扫描空格分隔值。不要用   如果您不想单独阅读每个值。您可以使用   Scanln读取一行,或直接从stdin读取。