【问题标题】:Go TCP server always throwing EOF after connectingGo TCP 服务器在连接后总是抛出 EOF
【发布时间】:2020-06-07 09:50:39
【问题描述】:

我有一个运行并发 TCP 4 服务器的 Go 例程,但每次我通过 Dial 连接到它时,TCP 服务器都会抛出一个错误,只显示“EOF”。有趣的是它正在处理第一行数据,但随后连接句柄抛出错误。

tcp 服务器实例:


 if err != nil {
   fmt.Println("an error occured: ")
   fmt.Println(err)
   return
 }


 defer l.Close()

 for {
   conn, err_handle := l.Accept()
   if err_handle != nil {
     fmt.Println("node err: ",err_handle)
     return
   }
   go handle_Connection(conn, topics)
 }

handle_Connection:

func handle_Connection(conn net.Conn, topics map[string][]string) {
  defer conn.Close()
  fmt.Println("client connected")

  for {
    data, err_handle := bufio.NewReader(conn).ReadString('\n')
    if err_handle != nil {
      fmt.Println("Err: ", err_handle)
      return
    }

客户:

  conn, err := net.Dial("tcp4", ":"+strconv.Itoa(port))

  if err != nil {
    fmt.Println("an error occured: ")
    fmt.Println(err)
  }

【问题讨论】:

  • 显示完整的客户端代码。在服务器读取循环之外创建 bufio.Reader 以避免丢弃从客户端读取的数据。
  • 请显示所有客户端代码。可能的问题是客户端关闭连接器或退出,但在链接文件中均不可见。

标签: go networking tcp server


【解决方案1】:

解决这个问题的一个非常简单的方法是在处理数据的循环中声明服务器 bufio 数据读取器。

func handle_Connection(conn net.Conn, topics map[string][]string) {
  defer conn.Close()
  fmt.Println("client connected")

  for {
    data, err_handle := bufio.NewReader(conn).ReadString('\n')
    if err_handle != nil {
      fmt.Println("Err: ", err_handle)
      return
    }

应该是:

func handle_Connection(conn net.Conn, topics map[string][]string) {
  defer conn.Close()
  fmt.Println("client connected")

  data, err_handle := bufio.NewReader(conn).ReadString('\n')
  for {
    if err_handle != nil {
      fmt.Println("Err: ", err_handle)
      return
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-09
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 2019-11-30
    • 2016-08-26
    相关资源
    最近更新 更多