socketIo 全平臺解決方案!!! 後臺是java,netty框架

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

相關文章
相關標籤/搜索