2016-07-07 64 views
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个问题?

+0

使用了'fmt.Scan'其扫描空间分隔值。如果您不想单独读取每个值,请不要使用它。您可以使用Scanln来读取一行,或直接从标准输入读取。 – JimB

+0

@JimB是的,意识到这一点。但是,当我尝试输入由空格分隔的几个值时,Scanln不起作用。该函数然后返回一个零错误 - 如果我尝试向它提供西里尔字母,它的行为方式也是如此。 – Arthmost

+0

ScanIn仍然需要与命令行上输入相同数量的参数。你没有看到任何错误,因为你正在检查'errs',但是打印'err'(总是使用相同的错误变量名来避免这种类型的错误)。您可能不需要fmt扫描功能。刚刚从标准输入读取。 – JimB

回答

0

问题@JimB回答:

您使用fmt.Scan其扫描空间分隔值。如果您不想单独读取每个值,请勿使用 。您可以使用 Scanln来读取一行,或直接从标准输入读取。

相关问题