我刚开始为使用TCP / IP套接字在C中制作的服务器编写Golang客户端,然后我发现我的频道无效。
任何想法为什么?
{{1}}
使用netcat测试我的服务器会产生以下输出: http://pasted.co/a37b2954
但我只有:http://pasted.co/f13d56b4
我是Golang的新手,所以也许我错了(我可能是)
答案 0 :(得分:2)
频道使用情况看起来没问题,但是,自您等待换行后,从频道中检索值会覆盖buf := <-read
之前的读取值。
此外,您可以使用bufio.Reader
将字符串读取到换行符。
您的代码段是部分的,因此无法执行,请尝试告诉我:
func reader(r io.Reader, channel chan<- string) {
bufReader := bufio.NewReader(conn)
for {
msg, err := bufReader.ReadString('\n')
if err != nil { // connection error or connection reset error, etc
break
}
channel <- msg
}
}
func client(e *gowd.Element) {
f, err := os.Create("/tmp/dat2")
if err != nil {
log.Fatal()
}
read := make(chan string)
c, err := net.Dial("tcp", "127.0.0.1:4242")
if err != nil {
log.Fatal(err)
}
go reader(c, read)
for {
msg := <-read
if msg == "WELCOME" {
fmt.Fprint(c, "GRAPHIC\n")
}
f.WriteString(msg + "\n")
}
//...
}
修改强>
请查找通用TCP客户端读取数据的示例。我还从上面的代码片段中删除了扫描仪并添加了缓冲区读取器。
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:4242")
if err != nil {
log.Fatal(err)
}
reader := bufio.NewReader(conn)
for {
msg, err := reader.ReadString('\n')
if err != nil {
break
}
fmt.Println(msg)
}
}