<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!