Tcp 使用Read()从连接读取时Google Go EOF

Tcp 使用Read()从连接读取时Google Go EOF,tcp,go,asyncsocket,Tcp,Go,Asyncsocket,我正在尝试使用GoogleGo语言创建一个简单的TCP服务器。我有一个客户机指向127.0.0.1:8484。当我的服务器代码试图读取缓冲区时,我在第37行收到一个EOF错误。客户端发送一个初始tcp数据包,表示其客户端版本和其他设置(客户端来自游戏,因此我知道我做错了什么)。我正在读这封信。然而,似乎我调用read太晚了,客户端已经发送了数据包,正在等待它的响应。任何帮助都将不胜感激,因为我真的被难倒了 package main import ( "fmt" "net"

我正在尝试使用GoogleGo语言创建一个简单的TCP服务器。我有一个客户机指向127.0.0.1:8484。当我的服务器代码试图读取缓冲区时,我在第37行收到一个EOF错误。客户端发送一个初始tcp数据包,表示其客户端版本和其他设置(客户端来自游戏,因此我知道我做错了什么)。我正在读这封信。然而,似乎我调用read太晚了,客户端已经发送了数据包,正在等待它的响应。任何帮助都将不胜感激,因为我真的被难倒了

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,err:=conn.read(buf[0:])”失败


修正:我是一个白痴,意识到我需要向客户发送一个握手包。

这对我使用
nc

$ nc localhost 8484
Client connected from 127.0.0.1:46464
hello
hello
world
world
^D
Fatal error: EOF
exit status 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。客户端连接到服务器。2.客户端向服务器发送初始信息,例如客户端版本。3.服务器读取缓冲区。4.服务器响应(目前我只是回显缓冲区)。它当前在读取缓冲区阶段“n,err:=conn.read(buf[0:])”失败。对不起,如果我原来的帖子不清楚。