我正在尝试使用Google Go语言创建一个简单的TCP服务器。我有一个指向127.0.0.1:8484的客户端。当我的服务器代码尝试读取缓冲区时,我在第37行收到EOF错误。客户端发送一个初始tcp数据包,表示其客户端版本和其他设置(客户端来自游戏,因此我知道我做错了什么)。我正在尝试阅读此数据包。但是,我似乎太迟了,客户端已经发送了数据包并等待其响应。任何帮助都会受到赞赏,因为我真的很难过。
package main
import (
"fmt"
"net"
"os"
)
func main() {
service := ":8484"
listener, err := net.Listen("tcp", service)
checkError(err)
fmt.Println("Login Server Started\nListening on port:", service[1:])
for {
conn, err := listener.Accept()
if err != nil {
continue
}
go handleClient(conn)
}
}
func handleClient(conn net.Conn) {
const BUFFER_LENGTH = 1024
defer conn.Close()
fmt.Println("Client connected from", conn.RemoteAddr())
var buf [BUFFER_LENGTH]byte
for {
n, err := conn.Read(buf[0:])
if err != nil {
checkError(err)
return
}
_, err2 := conn.Write(buf[0:n])
if err2 != nil {
checkError(err)
return
}
}
}
func checkError(err error) {
if err != nil {
fmt.Fprintf(os.Stderr, "Fatal error: %s\n", err.Error())
os.Exit(1)
}
}
为清晰起见编辑: 1.客户端连接到服务器。 2.客户端向服务器发送初始信息,例客户端版本。 3.服务器读取缓冲区。 4.服务器响应(目前我只是回显缓冲区)。
目前在读取缓冲阶段失败" n,错误:= conn.Read(buf [0:])"。
修正:我当时是个白痴,意识到我需要向客户端发送握手包。
答案 0 :(得分:1)
好吧,在checkError中你做了一个显式的os.Exit(1),如果客户端出现Read()错误,它将终止你的服务器。
而不是:
n, err := conn.Read(buf[0:])
if err != nil {
checkError(err)
return
}
你可以做到
n, err := conn.Read(buf[0:])
if err != nil {
fmt.Printf(err)
conn.Close()
return
}
将在服务器端打印错误,然后返回侦听下一个连接/继续操作。
答案 1 :(得分:0)
这适用于我使用nc
:
$ nc localhost 8484
Client connected from 127.0.0.1:46464
hello
hello
world
world
^D
Fatal error: EOF
exit status 1
所以我认为您的连接处理没有任何问题。您可能只是发送客户端不期望的数据,并且正在关闭连接。