socketIo 全平台解决方案!!! 后台是java,netty框架

<dependency>

    <groupId>com.corundumstudio.socketio</groupId>

    <artifactId>netty-socketio</artifactId>

    <version>1.7.7</version>

</dependency>

后端:

语言java,核心包netty-socketio-1.7.7

maven项目,核心包下好其他依赖会自动下载。

前端:

socket.io最新版本或cocos2d-js最新版本(cocos2d貌似不换版本好多年,不过不用担心,我们的后端是兼容到最新版本的,就算它哪天升级版本了对我们后端也没有影响!)

socket.io官方最新版本js,java前端已经测试通过,ios我让我们公司的同事测试下,测试没问题后会通知大家,各位放心使用。

好了,废话不多说,上核心代码!

后端:

主程序

public static void main(String[] args) {

        Configuration config = new Configuration();

        config.setPort(9090);

        SocketIOServer server = new SocketIOServer(config);

        

        server.addConnectListener(new ConnectListener() {

@Override

public void onConnect(SocketIOClient client) {

System.out.println("connect");

}

});

        

        MessageListener messageListener = new MessageListener();

        server.addEventListener("message", String.class,messageListener);

        

        MessageListener2 messageListener2 = new MessageListener2();

        messageListener2.setServer(server);

        server.addEventListener("message2", String.class,messageListener2);

        

        //启动服务

        server.start();

        System.out.println("start");

        try {

Thread.sleep(Integer.MAX_VALUE) ;

} catch (InterruptedException e) {

e.printStackTrace();

}

}

两个监听类:

package pandora.aliyun;

import com.corundumstudio.socketio.AckRequest;

import com.corundumstudio.socketio.SocketIOClient;

import com.corundumstudio.socketio.listener.DataListener;

public class MessageListener implements DataListener<String> {

@Override

public void onData(SocketIOClient client, String data, AckRequest ackSender) throws Exception {

System.out.println(data);

}

}

package pandora.aliyun;

import com.corundumstudio.socketio.AckRequest;

import com.corundumstudio.socketio.SocketIOClient;

import com.corundumstudio.socketio.SocketIOServer;

import com.corundumstudio.socketio.listener.DataListener;

import net.sf.json.JSONObject;

public class MessageListener2 implements DataListener<String> {

SocketIOServer server;

    public void setServer(SocketIOServer server) {

        this.server = server;

    }

@Override

public void onData(SocketIOClient client, String data, AckRequest ackSender) throws Exception {

System.out.println(data);

//JSON转换类,你们可以自己挑选自己喜欢的,这里推荐net.sf.json和alibaba的

JSONObject jobj = JSONObject.fromObject(data);

System.out.println(jobj.getString("phoneNumber"));

System.out.println(jobj.getString("token"));

client.sendEvent("messsage2", "success");

}

}

前端(官网有最新版例子,虽然也没那么新……我这里以cocos2d-js举例):

//全局变量

var _sioClient;                                                           

window.io;

var SocketIO = SocketIO || window.io;

//局部初始化连接,顺便向后台发点消息和事件

_sioClient = SocketIO.connect("http://127.0.0.1:9090"); 

        _sioClient.on("connect",function() {

            //send方法对应”message“监听事件,属于默认事件

            _sioClient.send("wo kao");

            var loginObj = new Object();

            loginObj.phoneNumber = "12345678";

            loginObj.token = "123";

            //自定义事件”message2“

            _sioClient.emit("message2", JSON.stringify(loginObj));

        });

      _sioClient.on('disconnect',function() {

            cc.log("disconnect");

        });

     _sioClient.on('message2', function(data) {

            if(data == "success"){

              cc.log("login success");

            }

        });

我遇到的两个坑!

第一种情况,连接不上,具体原因是握手协议的问题,细节我也不太清楚,等我以后研究完通讯协议的细节后再解释,先给个解决方案

JSB SocketIO::SIODelegate->fireEventToScript method called from native with name 'error' data: Operation timed out after 60004 milliseconds with 0 bytes received

socket.io的客户端连接问题解决:

修改源代码 SocketIo.cpp

std::stringstream pre;

    // pre << "http://" << _uri << "/socket.io/1/?EIO=2&transport=polling&b64=true";

    pre << "http://" << _uri << "/socket.io/?transport=polling&b64=0";

第二种情况,连接上了,但是emit方法在后台的监听接收不到,是因为你用了对象接收前端传过来的数据,浏览器没什么问题,问题是客户端不行!

解决方案:

传输对象只用json字符串,不要用对象!  字符串!字符串!字符串! 

特别是emit方法,后台的on方法,不要用对象,

用通用的String!!!!   String!  String! String!


转载于:https://my.oschina.net/u/2400340/blog/536207

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值