如果连接丢失,如何在Go重新连接中使用net.Dial?

时间:2017-08-11 17:47:08

标签: go

我在Go中有一个应用程序,它使用tcp连接到XMPP主机,然后使用xml解码器来连接XMPP。如果删除tcp连接,如何进行net.Dial重新连接?

删除连接后,我的错误通道出现以下错误: write tcp client:port->xmpp_server:5222: write: broken pipe。但是我不确定如何在我的Dial函数中正确处理它以使其重新连接。

// 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...

1 个答案:

答案 0 :(得分:0)

想出来。我刚开始关闭错误通道中任何错误的当前tcp连接,并重新创建TCP和XMPP(auth + listen)连接。