|
@@ -565,7 +565,7 @@ func (h *Hub) BindForServer(info *HostInfo) (err error) {
|
|
|
|
|
|
// 新建一个连接,不同的连接协议由底层自己选择
|
|
// 新建一个连接,不同的连接协议由底层自己选择
|
|
// channel: 要连接的频道信息,需要能表达频道关键信息的部分
|
|
// channel: 要连接的频道信息,需要能表达频道关键信息的部分
|
|
-func (h *Hub) ConnectToServer(channel string, force bool) (err error) {
|
|
|
|
|
|
+func (h *Hub) ConnectToServer(channel string, force bool, host *HostInfo) (err error) {
|
|
// 检查当前channel是否已经存在
|
|
// 检查当前channel是否已经存在
|
|
if !force {
|
|
if !force {
|
|
line := h.ChannelToLine(channel)
|
|
line := h.ChannelToLine(channel)
|
|
@@ -574,10 +574,12 @@ func (h *Hub) ConnectToServer(channel string, force bool) (err error) {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- // 获取服务地址等信息
|
|
|
|
- host, err := h.connectHostFunc(channel)
|
|
|
|
- if err != nil {
|
|
|
|
- return err
|
|
|
|
|
|
+ if host == nil {
|
|
|
|
+ // 获取服务地址等信息
|
|
|
|
+ host, err = h.connectHostFunc(channel, true)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
var conn conn.Connect
|
|
var conn conn.Connect
|
|
@@ -683,12 +685,13 @@ func (h *Hub) ConnectToServer(channel string, force bool) (err error) {
|
|
line := key.(*Line)
|
|
line := key.(*Line)
|
|
if line.channel == channel {
|
|
if line.channel == channel {
|
|
if line.state == Connected {
|
|
if line.state == Connected {
|
|
- if !force {
|
|
|
|
|
|
+ if force {
|
|
|
|
+ line.Close(true)
|
|
|
|
+ } else {
|
|
err = fmt.Errorf("[connectToServer ERROR] channel already connected: %s", channel)
|
|
err = fmt.Errorf("[connectToServer ERROR] channel already connected: %s", channel)
|
|
log.Println(err)
|
|
log.Println(err)
|
|
return false
|
|
return false
|
|
}
|
|
}
|
|
- return true
|
|
|
|
}
|
|
}
|
|
line.Start(conn, host)
|
|
line.Start(conn, host)
|
|
done = true
|
|
done = true
|
|
@@ -710,11 +713,13 @@ func (h *Hub) ConnectToServer(channel string, force bool) (err error) {
|
|
// 重试方式连接服务
|
|
// 重试方式连接服务
|
|
// 将会一直阻塞直到连接成功
|
|
// 将会一直阻塞直到连接成功
|
|
func (h *Hub) ConnectToServerX(channel string, force bool) {
|
|
func (h *Hub) ConnectToServerX(channel string, force bool) {
|
|
|
|
+ host, _ := h.connectHostFunc(channel, false)
|
|
for {
|
|
for {
|
|
- err := h.ConnectToServer(channel, force)
|
|
|
|
|
|
+ err := h.ConnectToServer(channel, force, host)
|
|
if err == nil {
|
|
if err == nil {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
+ host = nil
|
|
log.Println("[ConnectToServer ERROR, try it again]", err)
|
|
log.Println("[ConnectToServer ERROR, try it again]", err)
|
|
// 产生一个随机数避免刹间重连过载
|
|
// 产生一个随机数避免刹间重连过载
|
|
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
@@ -722,6 +727,33 @@ func (h *Hub) ConnectToServerX(channel string, force bool) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// 检测处理代理连接
|
|
|
|
+func (h *Hub) checkProxyConnect() {
|
|
|
|
+ if h.cf.ProxyTimeout <= 0 {
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ proxyTicker := time.NewTicker(time.Duration(h.cf.ProxyTimeout * int(time.Millisecond)))
|
|
|
|
+ for {
|
|
|
|
+ <-proxyTicker.C
|
|
|
|
+ now := time.Now().UnixMilli()
|
|
|
|
+ h.connects.Range(func(key, _ any) bool {
|
|
|
|
+ line := key.(*Line)
|
|
|
|
+ if line.host != nil && line.host.Proxy && now-line.updated.UnixMilli() > int64(h.cf.ProxyTimeout) {
|
|
|
|
+ host, err := h.connectHostFunc(line.channel, false)
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Println("[checkProxyConnect connectHostFunc ERROR]", err)
|
|
|
|
+ return false
|
|
|
|
+ }
|
|
|
|
+ err = h.ConnectToServer(line.channel, true, host)
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Println("[checkProxyConnect ConnectToServer WARNING]", err)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return true
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
// 建立一个集线器
|
|
// 建立一个集线器
|
|
// connectFunc 用于监听连接状态的函数,可以为nil
|
|
// connectFunc 用于监听连接状态的函数,可以为nil
|
|
func NewHub(
|
|
func NewHub(
|
|
@@ -745,5 +777,6 @@ func NewHub(
|
|
connectStatusFunc: connectStatusFunc,
|
|
connectStatusFunc: connectStatusFunc,
|
|
lastCleanDeadConnect: time.Now().UnixMilli(),
|
|
lastCleanDeadConnect: time.Now().UnixMilli(),
|
|
}
|
|
}
|
|
|
|
+ go h.checkProxyConnect()
|
|
return h
|
|
return h
|
|
}
|
|
}
|