gpt4 book ai didi

go - 简单的服务器客户端通信不起作用

转载 作者:数据小太阳 更新时间:2023-10-29 03:08:04 25 4
gpt4 key购买 nike

这个看似简单的例子并没有像预期的那样工作,我不好意思问这个问题,但是这里是:

有一个客户端重试连接到服务器,发送消息,然后等待响应:

func client() {
var conn net.Conn
var err error

// retry server until it is up
for {
conn, err = net.Dial("tcp", ":8081")
if err == nil {
break
}
log.Println(err)
time.Sleep(time.Second)
}

// write to server
_, err = conn.Write([]byte("request"))
if err != nil {
log.Println(err)
return
}

// block & read from server
var buf []byte
n, err := conn.Read(buf)
if err != nil {
log.Println(err)
return
}
log.Printf("From server: %s\n", buf[:n])
}

它连接到一个服务器,该服务器为每个连接读取和解释发送的数据,并在需要时发送响应:

func server() {
ln, _ := net.Listen("tcp", ":8081")
for {
conn, _ := ln.Accept()
go handleConn(conn)
}
}

func handleConn(conn net.Conn) {
var buf []byte
n, err := conn.Read(buf)
if err != nil {
return
}
log.Printf("Server got: %s\n", buf)

if string(buf[:n]) == "request" {
_, _ = conn.Write([]byte("response"))
}
}

全部由main函数驱动:

func main() {
go client()
server()
}

为简洁起见,省略了错误处理。预期的行为是客户端将连接到服务器并发送消息“请求”,然后阻塞读取。服务器接收“请求”并将消息“响应”发送回同一连接。客户端解锁,打印收到的消息并退出。相反,当程序运行时,会打印以下内容:

2019/09/01 22:24:02 From server: 
2019/09/01 22:24:02 Server got:

表明没有数据交换,客户端没有阻塞。

最佳答案

客户端的循环很奇怪!如果读/写结束,循环就没有意义。但错误只是这个:

  //var buf []byte <--- this read 0 bytes
buf := make([]byte, 1024)
n, err := conn.Read(buf)

给你的建议:

package main

import (
"log"
"net"
"time"
)

func client() {
var conn net.Conn
var err error

// retry server until it is up
for {
log.Printf("Connecting...")
conn, err = net.Dial("tcp", ":8082")
if err != nil {
log.Println(err)
break
}
time.Sleep(time.Second)
// write to server
log.Printf("Writing...")
_, err = conn.Write([]byte("request"))
if err != nil {
log.Println(err)
return
}
// block & read from server
log.Printf("Reading...")
var buf []byte
n, err := conn.Read(buf)
if err != nil {
log.Println(err)
return
}
log.Printf("From server: %s\n", buf[:n])
}
}

func server() {
ln, _ := net.Listen("tcp", ":8082")
for {
conn, _ := ln.Accept()
go handleConn(conn)
}
}

func handleConn(conn net.Conn) {
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
return
}
log.Printf("Server got: [%d bytes] %s\n", n, buf)

if string(buf[:n]) == "request" {
_, _ = conn.Write([]byte("response"))
}
conn.Close()
}

func main() {
go client()
server()
}

关于go - 简单的服务器客户端通信不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57751871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com