【问题标题】:Connection getting closed inside goroutine连接在 goroutine 内关闭
【发布时间】:2020-04-30 12:07:01
【问题描述】:

我正在编写一个与套接字服务器连接的简单 go 程序。 我正在使用 goroutine 不断寻找传入的消息。 但是在 goroutine 内部连接被关闭。有人可以告诉我发生了什么吗?

下面是我的测试客户端

package main

import (
    "fmt"
    "net"
    "os"
    "encoding/json"
    "bufio"
)

type test_user struct {
    ID string
    Conn net.Conn
    Messages chan interface{}
}

func CreateTestUser(id string) test_user {
    return test_user{id, nil, nil}
}

/* 
1. Try connecting
2. Wait for connected packet
3. Send first packet (Init packet)
*/
func (user *test_user) Connect() {
    conn, err := net.Dial(CONN_TYPE, CONN_HOST+":"+CONN_PORT)
    if err != nil {
        fmt.Println("Could not connect", err.Error())
        os.Exit(1)
    }
    user.Conn = conn
    user.Messages = make(chan interface{})
    reader := bufio.NewReader(conn)
    message, _ := reader.ReadBytes(DELIMITER)
    user.SendMessage(InitPacket{TYPE_USER,user.ID})
    //message, _ = reader.ReadBytes(DELIMITER)
    //message, _ = reader.ReadBytes(DELIMITER)  // If I uncomment these lines it will wait for new messages
    //message, _ = reader.ReadBytes(DELIMITER)
    go func() {
        for {
            var readErr error
            message, readErr = reader.ReadBytes(DELIMITER) // this always returns error "Error on read read tcp 127.0.0.1:54694->127.0.0.1:3333: use of closed network connection"/

            if readErr == nil {
                var packet interface{}
                error := json.Unmarshal(message, &packet)
                if error != nil {
                    fmt.Println("Unable to parse message", string(message), error.Error())
                }
                user.Messages <- packet
            } else {
                fmt.Println("Error on read", readErr.Error())
            }       
        }
    }()
}

有人可以帮我解决这个问题吗?另外,我是 golang 的新手,请提出改进​​建议。

【问题讨论】:

    标签: go


    【解决方案1】:

    Connect 之外查看更多代码会很有帮助。

    Connect 启动一个新的 goroutine,但它不会等待它——它会立即返回。 Connect返回后是否可以关闭连接?

    通常,当您启动一个 goroutine 来处理一个连接时,您的“主”goroutine 会继续等待其他事情 - 新连接和/或与每个连接的 goroutine 进行一些握手。我怀疑这不是这里发生的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 2018-05-10
      • 2018-10-07
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      相关资源
      最近更新 更多