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

com.corundumstudio.socketio netty-socketio 1.7.7

后端:
语言java,核心包netty-socketio-1.7.7
maven项目,核心包下好其他依赖会自动下载。

前端:
socket.io最新版本或cocos2d-js最新版本(cocos2d貌似不换版本好多年,不过不用担心,我们的后端是兼容到最新版本的,就算它哪天升级版本了对我们后端也没有影响!)
socket.io官方最新版本js,java前端已经测试通过,ios我让我们公司的同事测试下,测试没问题后会通知大家,各位放心使用。
(ios测试过了也是可以的,没用问题,么么哒^_^)

好了,废话不多说,上核心代码!
备注!!!这是Extension中的包!!!记得引入Extension!!!记得引入Extension!!记得引入Extension!!

后端:
主程序
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 {

@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 {

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!

第三种情况,客户端连接成功,但是手机端连接不上,那是因为手机端不支持局域网……
有点坑…………我郁闷了两天后偶然发现的…………
你们只要能保证pc或者mac端没问题就可以了,
然后用阿里云或者各种xx云服务器测试吧……
独立ip就可以啦……便宜的也就100+块钱测试就够用了……

1赞
  • (void)emit:(NSString * __nonnull)event withItems:(NSArray * __nonnull)items;
    我这里传的就是 数组里面套字典 传字符串 没任何反应。

你前后端定义要一致,
因为全平台各种语言有差异,所以才会推荐你用字符串传递数据。
而且协议默认的send message方法就是传字符串,emit方法是在send方法上拓展出来的。

我这里遇到能连接上,但是DataListener的onData不被调用的情况,请问是否同样遇到过

是第二种情况吗?
客户端的emit方法里面传的是对象?

弄懂了,我把client的send message方法写在on message了, on message只是监听

遇到第一中情况,求指点啊啊JSB SocketIO::SIODelegate->fireEventToScript method called from native with name ‘error’ data: Operation timed out after 60013 milliseconds with 0 bytes received

还没nodejs好用,netty-socketio好像开了很多线程,好像24个,还有http服务器没有集成,就只有个长链接,短链接都没有好的

你好,我也出现在网页端可以连接,在手机端就不能连接的情况,可是我把netty-socketio部署到阿里云,也是不能连接,网页都能连接,并不是像你所说的是局域网的问题。

太感谢啦

修改了SocketIO.cpp,是否要重新编译一下呢?

我修改完发现请求还是 b64=true

我用的是cocos creator