您好我试图在golang中学习一些套接字编程,我正在学习本教程
http://synflood.at/tmp/golang-slides/mrmcd2012.html#1
以下是本教程在一页上的最终结果。 https://github.com/akrennmair/telnet-chat/blob/master/03_chat/chat.go
我对如何编写此程序的客户端感到困惑,我创建了一个连接并拨入服务器运行的同一个端口/ ip,但从那里我不知道。我有新创建的连接的read()和write()函数,但不知道在哪里划分读取或任何东西。考虑到文本输入是在服务器中进行的,我想我只需要阅读某种类型的读物吗?
package main
import (
"bufio"
"fmt"
"net"
"os"
)
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:6000")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
for {
fmt.Println(bufio.NewReader(conn).ReadString([]byte("\n")))
}
}
答案 0 :(得分:10)
bufio.NewReader
只能在for
之前使用一次。例如connbuf := bufio.NewReader(conn)
。然后你可以在connbuf上使用ReadString,它返回字符串,也许是一个错误。例如:
connbuf := bufio.NewReader(conn)
for{
str, err := connbuf.ReadString('\n')
if len(str)>0 {
fmt.Println(str)
}
if err!= nil {
break
}
}
我正在检查len
和err
,因为ReadString
可能会返回数据和错误(连接错误,连接重置等),因此您需要同时检查两者。< / p>
答案 1 :(得分:1)
如果您想要阅读所有收到的数据,这是一个简单的解决方案。
connbuf := bufio.NewReader(c.m_socket)
// Read the first byte and set the underlying buffer
b, _ := connbuf.ReadByte()
if connbuf.Buffered() > 0 {
var msgData []byte
msgData = append(msgData, b)
for connbuf.Buffered() > 0 {
// read byte by byte until the buffered data is not empty
b, err := connbuf.ReadByte()
if err == nil {
msgData = append(msgData, b)
} else {
log.Println("-------> unreadable caracter...", b)
}
}
// msgData now contain the buffered data...
}