STF ‘Socket connection was lost’ 问题咨询

今天也是收获满满的一天啊 · April 12, 2019 · Last by 今天也是收获满满的一天啊 replied at April 12, 2019 · 766 hits

问题描述

在使用STF过程中,时常会发生 “Socket connection was lost” 的情况。错误截图如下所示:

环境描述

系统:Ubuntu 18.04
电脑型号:Acer TMP249-G2-M-5102
内存:16GB DDR4/500GB HDD

复现步骤

Server端启动服务,同一局域网下的另一台电脑使用Opera浏览器(Chrome浏览器、FireFox浏览器也行)访问STF平台,选择控制某一台手机设备,随机将浏览器窗口最小化。

初步分析

在浏览器弹框提示 “Socket connection was lost” 后,不点击 “try to reconnect” ,直接关闭弹框。
此时在浏览器上虽然无法再通过鼠标操纵手机,但是在手机端操作后,浏览器端仍然能实时显示手机屏幕截图。

再通过查阅OpenSTF资料及查看源码,发现 实时显示设备截图 和 操作手机 是维护在两条连接上的。

实时显示设备截图,服务运行在 7400-7700 端口上,每个手机会分配在此区间内的不同端口并建立链接。
代码路径:/home/ubuntu/git/stf/lib/cli/provider/index.js

.option('max-port', {
describe: 'Highest port number for device workers to use.'
, type: 'number'
, default: 7700
})
.option('min-port', {
describe: 'Lowest port number for device workers to use.'
, type: 'number'
, default: 7400
})

操作手机,服务运行在 7110 端口上,会有多个客户端(对应不同设备)与此端口建立连接。
代码路径:/home/ubuntu/git/stf/lib/units/websocket/index.js

.option('websocket-port', {
describe: 'The port the websocket unit should run at.'
, type: 'number'
, default: 7110
})

综上,我这边发生的socket连接端口,其实是建立在7110端口上的连接断开了。

抓包分析

为了了解为什么建立在7110端口上的连接会断开,使用wireshark进行了抓包。发现了一个规律:
每隔26s,客户端会给服务包发一个包,包内容(Line-based text data)为2,服务端会给客户端返回一个包,包内容(Line-based text data)为3;如果在下一个26s,这两个包未能成功发送,在第30s时,服务端便会向客户端发起 close socket 的包,随即客户端给予响应,建立在7110端口上的连接就断开了。

为了直观表述,下面列出截图:
客户端:192.168.2.1 服务端:192.168.2.3

  • 第一次断开


第18968帧,在第498s,客户端给服务端发包(Line-based text data 为 2 )


第18969帧,在第498s,服务端给客户端发包(Line-based text data 为 3 )


第19003帧,在第524s,客户端给服务端发包(Line-based text data 为 2 )


第19004帧,在第524s,服务端给客户端发包(Line-based text data 为 3 )


第19012帧,在第550s,客户端给服务端发包(Line-based text data 为 2 )


第19013帧,在第550s,服务端给客户端发包(Line-based text data 为 3 )
第19038帧,在第580s,服务端给客户端发包(Websocket connection close )
第19040帧,在第580s,客户端给服务端发包(Websocket connection close )

  • 第二次断开


第25169帧,在第726s,客户端给服务端发包(Line-based text data 为 2 )
第25171帧,在第726s,服务端给客户端发包(Line-based text data 为 3 )
第25333帧,在第757s,服务端给客户端发包(Websocket connection close )
第25335帧,在第757s,客户端给服务端发包(Websocket connection close )

  • 第三次断开


第33709帧,在第1424s,客户端给服务端发包(Line-based text data 为 2 )
第33710帧,在第1424s,服务端给客户端发包(Line-based text data 为 3 )
第33724帧,在第1451s,客户端给服务端发包(Line-based text data 为 2 )
第33725帧,在第1451s,服务端给客户端发包(Line-based text data 为 3 )
第33800帧,在第1478s,客户端给服务端发包(Line-based text data 为 2 )
第33803帧,在第1478s,服务端给客户端发包(Line-based text data 为 3 )
第33818帧,在第1504s,客户端给服务端发包(Line-based text data 为 2 )
第33819帧,在第1504s,服务端给客户端发包(Line-based text data 为 3 )
第33827帧,在第1530s,客户端给服务端发包(Line-based text data 为 2 )
第33828帧,在第1530s,服务端给客户端发包(Line-based text data 为 3 )
第33843帧,在第1560s,服务端给客户端发包(Websocket connection close )
第33844帧,在第1560s,客户端给服务端发包(Websocket connection close )

以上,大概是这样一个规律。

咨询

曾尝试看stf代码,奈何对nodejs及angularjs都不太熟悉,看的一知半解也没太明白。所以想请教各位大神和前辈,能帮忙解答一下疑惑吗?
建立在7110端口上的连接是有类似的心跳机制吗?心跳间隔为26s?而又为什么是在第30s的时候连接会断开?

共收到 2 条回复 时间 点赞

定位方法有问题,你为什么不先看log而是抓包分析?心跳机制是可以配置的在启动项里面配置的。我也是不懂js然后做二次开发的,不要让语言成为阻碍。

0x88 回复

感谢回复呀~ 我悄悄关注了的前辈~😀

回复问题1 为什么不先看log: 您是指的stf local启动后的命令行中输出的日志嘛?这个日志我有看,可能我看的还不够仔细,印象中日志中只输出了正在监听7110端口,之后建立在7110端口上的socket连接断开了 日志中似乎没有异常信息输出。所以就没把这个分析过程列出来。(有错误的地方还请指教呀。)

回复问题2 心跳机制可以在启动项中配置:这个可以麻烦您再具体一点嘛?这一块逻辑在哪个地方呀,我还没找着,所以来社区求助了。

感谢您的激励呀~ 您写的二次开发和adb断线分析等我都反反复复读了好多遍~ 语言正在学习中,也在努力啃,向各位看齐呀😉

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up