gpt4 book ai didi

go - 在 Golang 服务器中接受一个持久的 tcp 连接

转载 作者:IT王子 更新时间:2023-10-29 00:38:40 24 4
gpt4 key购买 nike

我正在试验 Go - 并想创建一个 TCP 服务器,我可以远程登录到它、发送命令和接收响应。

const (
CONN_HOST = "localhost"
CONN_PORT = "3333"
CONN_TYPE = "tcp"
)

func main() {

listener, err := net.Listen(CONN_TYPE, fmt.Sprintf("%s:%s", CONN_HOST, CONN_PORT))
if err != nil {
log.Panicln(err)
}

defer listener.Close()

for {
conn, err := listener.Accept()
if err != nil {
log.Panicln(err)
}

go handleRequest(conn)
}
}

func handleRequest(conn net.Conn) {
buffer := make([]byte, 1024)

length, err := conn.Read(buffer)
if err != nil {
log.Panicln(err)
}

str := string(buffer[:length])

fmt.Println(conn.RemoteAddr().String())
fmt.Printf("Received command %d\t:%s\n", length, str)

switch str {
case "PING\r\n":
sendResponse("PONG", conn)
case "PUSH\r\n":
sendResponse("GOT PUSH", conn)
default:
conn.Write([]byte(fmt.Sprintf("UNKNOWN_COMMAND: %s\n", str)))
}

conn.Close() // closes the connection
}

func sendResponse(res string, conn net.Conn) {
conn.Write([]byte(res+"\n"))
}

上面的代码片段每次都会关闭连接,将我踢出终端 session 。但我真正想要的是能够保持连接打开以进行更多 I/O 操作。如果我只是删除 conn.Close(),那么服务器似乎卡在某个地方,因为它没有收到任何更多响应。

我解决这个问题的方法是让我的 handleRequest 方法无限循环,这样它在收到 QUIT\r\n 消息之前永远不会退出。这是否合适 - 或者是否有更好的实现方式?

func handleRequest(conn net.Conn) {
for {
log.Println("Handling Request")
buffer := make([]byte, 1024)

length, err := conn.Read(buffer)
if err != nil {
log.Panicln(err)
}

str := string(buffer[:length])

fmt.Println(conn.RemoteAddr().String())
fmt.Printf("Received command %d\t:%s\n", length, str)

switch str {
case "PING\r\n":
sendResponse("PONG", conn)
case "PUSH\r\n":
sendResponse("GOT PUSH", conn)
case "QUIT\r\n":
sendResponse("Goodbye", conn)
conn.Close()
default:
conn.Write([]byte(fmt.Sprintf("UNKNOWN_COMMAND: %s\n", str)))
}
}
}

最佳答案

你的第二个循环示例已经是你想要的了。您只需循环并读取所需的时间(或者可能直到某些读/写超时或外部取消信号)。

但是还是有错误:TCP 为您提供了一个字节流,其中不能保证来自一侧的一次写入将在另一侧以相同的数据长度准确地产生一次读取。这意味着如果客户端写入 PING\r\n,您在第一次读取时仍然只能收到 PI。您可以通过使用 bufio.Scanner 来解决这个问题,并且始终读取到第一个换行符。

关于go - 在 Golang 服务器中接受一个持久的 tcp 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40190438/

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