Go 如果连接丢失,如何使网络拨入重新连接?
我在Go中有一个应用程序,它使用tcp连接到XMPP主机,然后使用xml解码器与XMPP对话。如果tcp连接断开,如何重新连接net.Dial 断开连接时,我的错误通道出现以下错误: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
写入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流。