帖子
帖子
用户
博客
课程
显示全部楼层
4
帖子
1
勋章
4918
Y币

[插件开发] socketManager里的重大BUG,经测试严重到无法使用的程度

[复制链接]
发表于 2015-9-20 15:24:02
本帖最后由 偶&然 于 2015-9-20 15:25 编辑

在用socketManager做个小程序,服务器端用.NET搞定,如图,可以正常收发。
QQ图片20150920151501.png


但是用APICloud写程序的时候遇到了问题,就是:
socketManager.write只能发送一次消息,发第二次消息服务器端怎么都是收不到...
不管我是把socketManager.write放在createSocket回调里面,还是单独把sid存起来用的时候在传过去,都不行,只能发一次消息............




请官方给出答案


代码贴上来
  1.     apiready = function () {
  2.       
  3.                  
  4. socketManager = api.require('socketManager');
  5. createSocket();
  6. setInterval("TCPLINE();", 5000);

  7.     }
  8.    
  9. //定义TCP连接函数
  10. function createSocket() {
  11.         socketManager.createSocket({
  12.             host: '127.0.0.1',
  13.             port: 1024
  14.         }, function (ret, err) {
  15.             if (ret) {

  16.                 var state = ret.state;
  17.                  sid = ret.sid
  18.                 var data = ret.data;
  19.                 var stateStr = '';
  20.                 if (101 === state) {
  21.                     //stateStr = "创建成功";
  22.                 } else if (102 === state) {
  23.                     var sid = ret.sid
  24.                $api.setStorage('sid',sid );//把SID储存在本地
  25.                     var u = $api.getStorage('u');
  26.                     var str = 'Login ' + sid + ' ' + Math.random() + '\r\n';
  27.                  

  28.                    socketManager.write({
  29.                         sid: sid,            //由createSocket方法获取得到
  30.                        data: str + '第1次发....'
  31.                     });
  32.                     
  33.                    socketManager.write({
  34.                         sid: sid,            //由createSocket方法获取得到
  35.                        data: str + '第2次发...'
  36.                     });
  37.                                                 
  38.                     
  39.                 } else if (103 === state) {
  40.                     //stateStr = "收到消息";
  41.                     //api.alert({msg:data});
  42.                     api.toast({msg:data,duration:1000,location:'middle'});
  43.                     _msg_dingdan();
  44.                                     
  45.                 } else if (201 === state) {
  46.                     window.setTimeout(_showMsg(ip, port), 60000);
  47.                     //stateStr = "创建失败";
  48.                 } else if (202 === state) {
  49.                     window.setTimeout(_showMsg(ip, port), 60000);
  50.                     //stateStr = "连接失败";
  51.                 } else if (203 === state) {
  52.                     window.setTimeout(_showMsg(ip, port), 60000);
  53.                     stateStr = "网络连接断开状态";
  54.                     api.toast({msg:stateStr,duration:1000,location:'middle'});
  55.                 } else if (204 === state) {
  56.                     //window.setTimeout(_showMsg(ip,port),60000);
  57.                     stateStr = "服务器网络断开状态";
  58.                     api.toast({msg:stateStr,duration:1000,location:'middle'});
  59.                 } else if (205 === state) {
  60.                     window.setTimeout(_showMsg(ip, port), 60000);
  61.                     //stateStr = "发生未知错误";
  62.                 }
  63.                 var msg = 'sid: ' + sid + '\nstate: ' + stateStr + '\ndata: ' + (data ? data : '');
  64.                 //api.alert({msg:msg});
  65.             }
  66.             else {
  67.                 window.setTimeout(_showMsg(ip, port), 60000);
  68.             }
  69.         });
  70.    
  71. }

  72. //TCP保持在线心跳包
  73. function TCPLINE() {
  74. var sid = $api.getStorage('sid');//读取储存在本地的SID
  75. var str = 'Login ' + sid + ' ' + Math.random() + '\r\n';

  76. socketManager.write({
  77.     sid: sid,            //由createSocket方法获取得到
  78.     data: str
  79. }, function(ret, err){
  80.     if(ret.status){
  81.         sid = ret.sid
  82.         $api.setStorage('sid',sid );//把SID储存在本地
  83.         api.toast({msg:ret.data,duration:5000,location:'middle'});
  84.         //_msg_dingdan();
  85.     }else{
  86.         api.alert({msg:'error'});
  87.     }
  88. });
  89. }

  90. function TCPclose(){
  91. var sid = $api.getStorage('sid');//读取储存在本地的SID
  92.     socketManager.closeSocket({
  93.     sid: sid            //由createSocket方法获取得到
  94.       }, function(ret, err){
  95.       if(ret.status){
  96.         api.alert({msg:'关闭成功'});
  97.       }else{
  98.         api.alert({msg:'error'});
  99.        }
  100.       });
  101. }


  102.     }
复制代码


2
帖子
0
勋章
21
Y币
本帖最后由 一曳霓虹 于 2016-3-21 23:51 编辑

雷声大,雨点小
1
帖子
0
勋章
92
Y币
发送的时候,增加换行符号 即 data: str + '第1次发....'  这里增加换行符  data: str + '第1次发....\r\n'
1
帖子
0
勋章
92
Y币
data: str + '第2次发...'   也改为 data: str + '第2次发...\r\n'   试试
4
帖子
1
勋章
4918
Y币
无限紫云 发表于 2015-9-21 00:56
data: str + '第2次发...'   也改为 data: str + '第2次发...\r\n'   试试

经过测试,改加符号\r\n后,还是只能发送第一次消息,后面的消息石沉大海...
1
帖子
0
勋章
92
Y币
我最近也做了个 SOCKET 的项目,但是未遇见你说这种情况,是否能排除,你服务端问题?
5
帖子
0
勋章
1万+
Y币
代码也没看到什么问题,是不是服务器的原因?
4
帖子
1
勋章
4918
Y币
技术支持-M 发表于 2015-9-21 19:52
代码也没看到什么问题,是不是服务器的原因?

已确认,是服务器的问题,socketManager正常!
感谢!
4
帖子
1
勋章
4918
Y币
无限紫云 发表于 2015-9-21 13:46
我最近也做了个 SOCKET 的项目,但是未遇见你说这种情况,是否能排除,你服务端问题? ...

已确认,是服务器的问题,socketManager正常!
感谢!
0
帖子
0
勋章
2
Y币
偶&然 发表于 2015-9-24 09:11
已确认,是服务器的问题,socketManager正常!
感谢!

能否贴个源码demo 看看
您需要登录后才可以回帖 登录

本版积分规则