Go 如果连接丢失,如何使网络拨入重新连接?

Go 如果连接丢失,如何使网络拨入重新连接?,go,Go,我在Go中有一个应用程序,它使用tcp连接到XMPP主机,然后使用xml解码器与XMPP对话。如果tcp连接断开,如何重新连接net.Dial 断开连接时,我的错误通道出现以下错误: 写入tcp客户端:端口->xmpp\U服务器:5222:写入:断管。但是,我不确定如何在我的拨号功能中正确处理它,使其重新连接 // package xmpp // Conn represents a connection type Conn struct { incoming *xml.Decoder

我在Go中有一个应用程序,它使用tcp连接到XMPP主机,然后使用xml解码器与XMPP对话。如果tcp连接断开,如何重新连接net.Dial

断开连接时,我的错误通道出现以下错误:
写入tcp客户端:端口->xmpp\U服务器:5222:写入:断管
。但是,我不确定如何在我的
拨号功能中正确处理它,使其重新连接

// package xmpp
// Conn represents a connection
type Conn struct {
    incoming *xml.Decoder
    outgoing net.Conn
    errchan  chan error
}

// SetErrorChannel sets the channel for handling errors
func (c *Conn) SetErrorChannel(channel chan error) {
    c.errchan = channel
}

// Dial dials an xmpp host
func Dial(host string) (*Conn, error) {
    c := new(Conn)
    var err error

    c.outgoing, err = net.Dial("tcp", host+":5222")
    if err != nil {
        log.Printf("Can't dial %s:5222: %s", host, err)
        return c, err
    }

    // TCP Keep Alive
    err = c.outgoing.(*net.TCPConn).SetKeepAlive(true)
    if err != nil {
        c.errchan <- err
    }
    err = c.outgoing.(*net.TCPConn).SetKeepAlivePeriod(30 * time.Second)
    if err != nil {
        c.errchan <- err
    }

    c.incoming = xml.NewDecoder(c.outgoing)
    log.Printf("Connected to: %s", c.outgoing.RemoteAddr())
    return c, nil
}

// In a separate package
func NewXMPPClient(config) (*Client, error) {
    errchannel := make(chan error)
    connection, err := xmpp.Dial(host)

    if err != nil {
        return nil, err
    }
    connection.SetErrorChannel(errchannel)

    // Do XMPP auth, receive messages, etc...
//包xmpp
//Conn表示一个连接
类型连接结构{
传入*xml.Decoder
传出网络连接
错误
}
//SetErrorChannel设置用于处理错误的通道
func(c*Conn)设置错误通道(通道更改错误){
c、 errchan=信道
}
//拨入xmpp主机
func拨号(主机字符串)(*连接,错误){
c:=新(康涅狄格州)
变量错误
c、 传出,err=net.Dial(“tcp”,主机+”:5222)
如果错误!=零{
log.Printf(“无法拨打%s:5222:%s”,主机,错误)
返回c,错误
}
//TCP保持活动状态
err=c.outgoing.(*net.TCPConn).SetKeepAlive(true)
如果错误!=零{

c、 errchan解决了这个问题。我刚刚开始在错误通道中出现任何错误时关闭当前tcp连接,并重新创建tcp和XMPP(auth+listen)连接。

重新连接不是
拨号的责任,只是连接。
拨号的用户负责智能地重新连接,如果这适合于使用情况。我不是指net.Dial功能,而是指我自己的拨号()功能在上面的代码中。您无法真正从
拨号重新连接
-当
拨号
返回时,它将
连接
的所有权传递给它的调用者,因此
拨号
不应该再对该
连接
进行任何操作,否则会导致各种奇怪的问题。如果您故意断开连接?Conn如何知道何时重新连接?是否应重新发送连接失败时写入的数据?这似乎不是一个可以或应该在此函数中解决的问题。我不确定是否可能“我不想故意关闭它”。至少,您的进程最终将退出,并且它应该正常地关闭其连接,而不是尝试重新打开它。对于XMPP,您必须在重新建立连接时重新启动XML流。