这个问题解决了吗
websocket延时问题功能对延时要求非常高,又需要网络通信,所以使用了websocket。 写了一个测试页面,功能很简单:定义一个变量存储要发送的数据。打开websocket连接,然后向服务端发送变量中的数据。服务端收到后会返回。当SocketTask.onMessage监听到服务端数据后,立马向服务端再次发送变量中的数据。 这样,就是发送-接收-发送-接收这样的循环。小程序这边没有任何其他逻辑处理,页面也没有使用定时器。勾选了开发者工具中的“不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书”。 然后,使用开发者工具调试,服务端进行了打印,发现从服务端返回数据到再次接收到开发者工具发来的数据,耗时在10ms以内。 然而,使用真机调试,发现这个耗时普遍在120ms以上。服务端进行了抓包和打印,发现每次小程序收到服务端返回,先给出一个tcp的确认,这个耗时很短,一般是20ms左右,但等收到小程序的websocket数据,150ms就过去了。 本来网络延时若在40ms以内,是可以满足要求的。但现在局域网就达到120ms以上,这个太高了,想请教一下为何tcp的确认明明这么快,websocket发送数据却延迟这么高? 具体开发环境为:小程序开发PC和服务端PC在同一个局域网,连接同一个路由器;微信小程序真机调试使用iPhone6S,iPhone6S没有插SIM卡,使用wifi连接同一个路由器。 调试基础库试过2.0.4和2.3.0。 附上测试代码: [代码]Page({[代码][代码] [代码][代码]data: {[代码][代码] [代码][代码]socketTask: [代码][代码]null[代码][代码],[代码][代码] [代码][代码]data: [代码][代码]'123'[代码][代码] [代码][代码]},[代码][代码] [代码][代码]onLoad: [代码][代码]function[代码] [代码]() {[代码][代码] [代码][代码]},[代码][代码] [代码][代码]openConnect: [代码][代码]function[代码] [代码]() {[代码][代码] [代码][代码]let that = [代码][代码]this[代码][代码];[代码][代码] [代码][代码]let socketTask = wx.connectSocket({[代码][代码] [代码][代码]url: [代码][代码]'ws://192.168.1.10:10002'[代码][代码],[代码][代码] [代码][代码]success: [代码][代码]function[代码] [代码](res) {[代码][代码] [代码][代码]console.log([代码][代码]"建立连接成功"[代码][代码]);[代码][代码] [代码][代码]console.log(res);[代码][代码] [代码][代码]},[代码][代码] [代码][代码]fail: [代码][代码]function[代码] [代码](res) {[代码][代码] [代码][代码]console.log([代码][代码]"建立连接失败"[代码][代码]);[代码][代码] [代码][代码]console.log(res);[代码][代码] [代码][代码]}[代码][代码] [代码][代码]});[代码][代码] [代码][代码]socketTask.onOpen([代码][代码]function[代码] [代码](res) {[代码][代码] [代码][代码]console.log([代码][代码]"连接打开"[代码][代码]);[代码][代码] [代码][代码]console.log(res);[代码][代码] [代码][代码]});[代码][代码] [代码][代码]socketTask.onClose([代码][代码]function[代码] [代码](res) {[代码][代码] [代码][代码]console.log([代码][代码]"连接关闭"[代码][代码]);[代码][代码] [代码][代码]console.log(res);[代码][代码] [代码][代码]});[代码][代码] [代码][代码]socketTask.onError([代码][代码]function[代码] [代码](res) {[代码][代码] [代码][代码]console.log([代码][代码]"连接错误"[代码][代码]);[代码][代码] [代码][代码]console.log(res);[代码][代码] [代码][代码]});[代码][代码] [代码][代码]socketTask.onMessage([代码][代码]function[代码] [代码](res) {[代码][代码] [代码][代码]console.log([代码][代码]"服务端返回消息"[代码][代码]);[代码][代码] [代码][代码]console.log(res);[代码][代码] [代码][代码]that.sendMsg();[代码][代码] [代码][代码]});[代码][代码] [代码][代码]this[代码][代码].data.socketTask = socketTask;[代码][代码] [代码][代码]},[代码][代码] [代码][代码]closeConnect: [代码][代码]function[代码] [代码]() {[代码][代码] [代码][代码]let socketTask = [代码][代码]this[代码][代码].data.socketTask;[代码][代码] [代码][代码]if[代码] [代码](socketTask) {[代码][代码] [代码][代码]socketTask.close({[代码][代码] [代码][代码]success: [代码][代码]function[代码] [代码](res) {[代码][代码] [代码][代码]console.log([代码][代码]"关闭接口成功"[代码][代码]);[代码][代码] [代码][代码]console.log(res);[代码][代码] [代码][代码]},[代码][代码] [代码][代码]fail: [代码][代码]function[代码] [代码](res) {[代码][代码] [代码][代码]console.log([代码][代码]"关闭接口失败"[代码][代码]);[代码][代码] [代码][代码]console.log(res);[代码][代码] [代码][代码]}[代码][代码] [代码][代码]});[代码][代码] [代码][代码]}[代码][代码] [代码][代码]},[代码][代码] [代码][代码]sendMsg: [代码][代码]function[代码] [代码]() {[代码][代码] [代码][代码]let value = [代码][代码]this[代码][代码].data.data;[代码][代码] [代码][代码]console.log([代码][代码]"尝试发送消息:"[代码] [代码]+ value);[代码][代码] [代码][代码]let socketTask = [代码][代码]this[代码][代码].data.socketTask;[代码][代码] [代码][代码]if[代码] [代码]([代码][代码]this[代码][代码].data.socketTask) {[代码][代码] [代码][代码]socketTask.send({[代码][代码] [代码][代码]data: value,[代码][代码] [代码][代码]success: [代码][代码]function[代码] [代码](res) {[代码][代码] [代码][代码]console.log([代码][代码]"发送消息成功"[代码][代码]);[代码][代码] [代码][代码]console.log(res);[代码][代码] [代码][代码]},[代码][代码] [代码][代码]fail: [代码][代码]function[代码] [代码](res) {[代码][代码] [代码][代码]console.log([代码][代码]"发送消息失败"[代码][代码]);[代码][代码] [代码][代码]console.log(res);[代码][代码] [代码][代码]}[代码][代码] [代码][代码]});[代码][代码] [代码][代码]}[代码][代码] [代码][代码]}[代码][代码]})[代码]
2020-09-23