Golang 中带有 TCP/IP 套接字的通道无法正常工作
Channels in Golang with TCP/IP socket not working
我刚开始为服务器编写 Golang 客户端,我用 C 语言用 TCP/IP 套接字创建了服务器,然后我发现我的频道不工作。
知道为什么吗?
func reader(r io.Reader, channel chan<- []byte) {
buf := make([]byte, 2048)
for {
n, err := r.Read(buf[:])
if err != nil {
return
}
channel <- buf[0:n]
}
}
func client(e *gowd.Element) {
f, err := os.Create("/tmp/dat2")
if err != nil {
log.Fatal()
}
read := make(chan []byte)
c, err := net.Dial("tcp", "127.0.0.1:4242")
if err != nil {
log.Fatal(err)
}
go reader(c, read)
for {
buf := <-read
n := strings.Index(string(buf), "\n")
if n == -1 {
continue
}
msg := string(buf[0:n])
if msg == "WELCOME" {
fmt.Fprint(c, "GRAPHIC\n")
}
f.WriteString(msg + "\n")
}
使用 netcat 测试我的服务器会产生以下输出:
http://pasted.co/a37b2954
但我只有:http://pasted.co/f13d56b4
我是 Golang 的新手,所以也许我错了(我可能是)
通道使用情况看起来不错,但是从通道中检索值会覆盖先前在 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 客户端读取数据的示例。我还从上面的代码片段中删除了扫描仪并添加了缓冲区 reader.
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)
}
}
我刚开始为服务器编写 Golang 客户端,我用 C 语言用 TCP/IP 套接字创建了服务器,然后我发现我的频道不工作。
知道为什么吗?
func reader(r io.Reader, channel chan<- []byte) {
buf := make([]byte, 2048)
for {
n, err := r.Read(buf[:])
if err != nil {
return
}
channel <- buf[0:n]
}
}
func client(e *gowd.Element) {
f, err := os.Create("/tmp/dat2")
if err != nil {
log.Fatal()
}
read := make(chan []byte)
c, err := net.Dial("tcp", "127.0.0.1:4242")
if err != nil {
log.Fatal(err)
}
go reader(c, read)
for {
buf := <-read
n := strings.Index(string(buf), "\n")
if n == -1 {
continue
}
msg := string(buf[0:n])
if msg == "WELCOME" {
fmt.Fprint(c, "GRAPHIC\n")
}
f.WriteString(msg + "\n")
}
使用 netcat 测试我的服务器会产生以下输出: http://pasted.co/a37b2954
但我只有:http://pasted.co/f13d56b4
我是 Golang 的新手,所以也许我错了(我可能是)
通道使用情况看起来不错,但是从通道中检索值会覆盖先前在 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 客户端读取数据的示例。我还从上面的代码片段中删除了扫描仪并添加了缓冲区 reader.
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)
}
}