引用:笑笑看 发表于 2018-04-17 13:00 遇到这种情况,我给你的建议是量化测试: 1)先评估发生这种情况时的网络情况,最好持续的ping服务器,看看ping的结果,并据此来分析网络情况跟代码的表现是否能对的上号; 2)抓出浏览器端完整的log日志; 3)抓出服务端完整的log日志。 只有这些科学的信息情况下,才能分析出是什么原因,写网络程序一定不能凭感觉。MobileIMSDK-Web的商用案例很稳定,而且其实Websocket或socket.io方案本身也是经过大量考验的,一些低级问题出现的可能几乎很小,所以一定是另有原因。 |
引用:JackJiang 发表于 2018-04-12 14:26 今天测试了一下,发现捂手建立长连接后,在点击发送一段时间后,会重新再次进行握手的动作,建立一个新的长连接 |
引用:JackJiang 发表于 2018-04-12 14:26 首先,非常感谢您分享的代码。 我的初始化是 initMethod(sendUserId, 1); fireSubmit(); 初始化完毕这两个方法后,通讯已经进行了握手,建立长连接。 当我发消息的时候重新调用了fireSubmit(); 在这种情况下出现online=false 但是islogin=true |
引用:笑笑看 发表于 2018-04-12 14:17 你测的点两只,相当于只是测了握手,还没有开始没长连接通信呢。 WebSocket的长连接建立是基于http的短连接握手实现的,所以很多人误以为websoket就像http的短连接一下,连一下就是了。其实不是这样。 你可以系统地读一读我整理的WebSocket系列基础文章:http://www.52im.net/thread-331-1-1.html |
引用:JackJiang 发表于 2018-04-11 11:23 我仔细核对了一下,刚刚开始进入页面的时候,就进行数据初始化以及模拟登陆服务器initMethod(sendUserId, 1); fireSubmit(); 客户端代码 var d = document, w = window; var $window = $(window); var $userId = ""; var $sendUserId = ""; var $inputMessage = $('#dope'); var $messages = $('#newsList'); var $sendMessageButton = $('.sendBtn'); var $userPic = ""; var $userName = ""; var $loginFlag = true;; var $roleId = ""; var $userListShow = ""; var temp_i = 0; //临时变量 // =================================【1】 end function initMethod(sendUserId, roleId) { $imLoginURL = imLoginURL; d = document, w = window; $window = $(window); $userId = userId + ""; $userPic = userPic; $userName = userName; $sendUserId = sendUserId; $inputMessage = $('#dope'); $messages = $('.newsList'); $sendMessageButton = $('.sendBtn'); $userListShow = $('#userListShow'); $roleId = roleId; // =================================【2】 start //设置公共参数 // 开启或关闭MobileIMSDK-Web的框架内部Log输出,建议仅在调试时设为true IMSDK.setDebugEnable(true); /** * 【设置MobileIMSDK-Web的回调方法1:用于debug的log输出】。 * * 框架回调时传入的参数1(必填):字符串类型,表示log内容; * 框架回调时传入的参数2(可选):bool量,true表示输出到console,否则默认方式(由开发者设置的回调决定); * 建议本回调的用途:开发者可在此回调中按照自已的意图打印MobileIMSDK-Web框架中的log,方便调试时使用。 */ IMSDK.callback_log = log; /** * 【设置MobileIMSDK-Web的回调方法2:用于收到聊天消息时在UI上展现出来(事件通知于收到IM消息时)】。 * * 框架回调时传入的参数1(必填):Protocal对象(Protocal详情请见 * “/libs/mobileimsdk-client-common.js”下的createCommonData4函数说明); * 建议本回调的用途:开发者可在此回调中处理收到的各种IM消息。 */ IMSDK.callback_showChatMessage = showChatMessage; /** * 【设置MobileIMSDK-Web的回调方法3:服务端对客户端提交的登陆请求处理完成后的回调(事件通知于成功登陆/认证后)】。 * * 框架回调时传入的参数:无参数; * 建议本回调的用途:开发者可在此回调中进行登陆IM服务器成功后的处理。 */ IMSDK.callback_afterLoginSucess = afterLoginSucess; /** * 【设置MobileIMSDK-Web的回调方法4:客户端的登陆请求被服务端认证失败后的回调(事件通知于 登陆/认证 失败后)】。 * 补充说明:登陆/认证失败的原因可能是用户名、密码等不正确等,但具体逻辑由服务端的 callBack_checkAuthToken * 回调函数去处理。 * * 调用时传入的参数:true表示是掉线重连后的认证失败(在登陆其间可能用户的密码信息等发生了变更),否则表示首次登陆时的认证失败; * 建议本回调的用途:开发者可在此回调中提示用户登陆IM服务器失败。 */ IMSDK.callback_afterLoginFailed = afterLoginSucessFailed; /** * 【设置MobileIMSDK-Web的回调方法5:网络连接已断开时的回调(事件通知于与服务器的网络断开后)】。 * * 框架时传入的参数:无参数; * 建议本回调的用途:开发者可在此回调中处理掉线时的界面状态更新等,比如设置将界面上的“在线”文字更新成“离线”。 */ IMSDK.callback_disconnected = afterDisconnected; /** * 【设置MobileIMSDK-Web的回调方法6:掉线重连成功后的回调(事件通知于掉线重连成功后)】。 * * 框架时传入的参数:无参数; * 建议本回调的用途:开发者可在此回调中处理掉线重连成功后的界面状态更新等,比如设置将界面上的“离线”文字更新成“在线”。 */ IMSDK.callback_reconnectSucess = afterReconnectSucess; // =================================【2】 end } function fireSubmit(userId) { // 登陆/认证后的才能发消息 if(IMSDK.isLogined()) { if(!!userId) { doSend(userId); } else { window.location.reload(); //刷新当前页面. } } // 没登陆的先登陆再说 else { remove(); //退出后进行登录 // doLogin(); } } 其他代码跟demo代码保持一致。 我对前端代码不是了解,在用鼠标点击攻击点击按钮模拟的话,应该是有连接。判断是否是长连接应该是我们的web服务器是否有心跳,是我这边web服务器设置有问题么 |
引用:笑笑看 发表于 2018-04-11 11:01 不管是c2s还是s2c,在MobileIMSDK-Web都是长连接实现。 长连接建立的前端是,有一个握手、认证过程,所以你能在MobileIMSDK里看到登陆服务器的过程,其实就是建议长连接的过程。 你测试的时候,模拟的点击,如果没有模拟出这个完整的长连接,并基于这个长连接进行通信,等于没有测试意义。因为长连接的测试不像你普通的web页面测试:只需要http打开、页面打开完成后就关闭了,而长连接除非你退出应用,tcp是一直在连接着的,不会也不应该被关闭 |
引用:JackJiang 发表于 2018-04-10 15:31 是这个样的,我想在web端做成群发功能,我做的模式是c2s,让后在s端循环用户后s2c,您是说c2s发送变成了短连接了,还是我这种模拟的方式不正确。群发是c2s,s2c这种模式还是其他,您是说我测试方法有问题,是这个意思么 |
引用:笑笑看 发表于 2018-04-10 14:59 MobileIMSDK是基于WebSocket发起通信的,WebSocket就是基于TCP的长连接,你这种模拟点击的,是没有办法模拟长连接的。你可以找WebSocket的长连接测试工具。说到底Web端即时通讯不是传统的Web短连接,你别理解混了 |
你测试工具用的什么?测试时,服务端的所有log输出都关闭了吗?有没有看到什么异常打出? 你可以参考这几个贴子来把你的nodejs和socket.io环境优化优化。 socket.io性能测试讨论:socket.io 高并发实战、socket.io保持6万+连接测试?、如何实现单服务器300万个长连接的?。 |