<dependency>前端
<groupId>com.corundumstudio.socketio</groupId>java
<artifactId>netty-socketio</artifactId>ios
<version>1.7.7</version>json
</dependency>後端
後端:瀏覽器
語言java,核心包netty-socketio-1.7.7socket
maven項目,核心包下好其餘依賴會自動下載。maven
前端:ide
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!