All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.voovan.http.extend.socketio.SIODispatcher Maven / Gradle / Ivy

package org.voovan.http.extend.socketio;

import org.voovan.http.extend.engineio.Config;
import org.voovan.http.extend.engineio.EIODispatcher;
import org.voovan.http.extend.engineio.EIOHandler;
import org.voovan.tools.json.JSON;
import org.voovan.tools.log.Logger;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Socket IO 消息分发类
 *
 * @author: helyho
 * Voovan Framework.
 * WebSite: https://github.com/helyho/Voovan
 * Licence: Apache v2 License
 */
public class SIODispatcher extends EIODispatcher {

    private Map sioEventHandlers;

    public SIODispatcher(Config config) {
        super(config);
        this.sioEventHandlers = new HashMap();
        super.on("message", new MessageHandler(this));
    }

    public SIODispatcher on(String Event, SIOHandler sioHandler){
        sioEventHandlers.put(Event, sioHandler);
        return this;
    }

    public class MessageHandler extends EIOHandler {
        private SIODispatcher sioDispatcher;

        public MessageHandler(SIODispatcher sioDispatcher){
            this.sioDispatcher = sioDispatcher;
        }

        public MessageHandler() {

        }

        @Override
        public String execute(String msg) {
            try {
                if (SIOParser.isSocketIOMessage(msg)) {
                    SIOPacket sioPacket = SIOParser.decode(msg);

                    if (sioPacket.getSocketType() == SIOPacket.CONNECT) {
                        SIOHandler sioHandler = sioEventHandlers.get("connect");
                        sioHandler.setNsp(sioPacket.getNsp());
                        sioHandler.setEioHandler(this);
                        sioHandler.setSioDispatcher(sioDispatcher);
                        if (sioHandler != null) {
                            sioHandler.execute(null);
                        }

                        return SIOParser.encode(sioPacket);
                    }

                    if (sioPacket.getSocketType() == SIOPacket.DISCONNECT) {
                        SIOHandler sioHandler = sioEventHandlers.get("disconnect");
                        sioHandler.setNsp(sioPacket.getNsp());
                        sioHandler.setEioHandler(this);
                        sioHandler.setSioDispatcher(sioDispatcher);
                        if (sioHandler != null) {
                            sioHandler.execute(null);
                        }
                        return SIOParser.encode(sioPacket);
                    }

                    if (sioPacket.getSocketType() == SIOPacket.ERROR) {
                        SIOHandler sioHandler = sioEventHandlers.get("error");
                        sioHandler.setNsp(sioPacket.getNsp());
                        sioHandler.setEioHandler(this);
                        sioHandler.setSioDispatcher(sioDispatcher);
                        if (sioHandler != null) {
                            sioHandler.execute(null);
                        }

                        return SIOParser.encode(sioPacket);
                    }


                    if (sioPacket.getSocketType() == SIOPacket.EVENT) {
                        List argsList = (List) JSON.parse(sioPacket.getData());
                        String event = (String) argsList.get(0);
                        argsList.remove(0);
                        Object[] args = argsList.toArray(new Object[]{});

                        SIOHandler sioHandler = sioEventHandlers.get(event);
                        sioHandler.setNsp(sioPacket.getNsp());
                        sioHandler.setEioHandler(this);
                        sioHandler.setSioDispatcher(sioDispatcher);
                        if (sioHandler != null) {
                            Object result = sioHandler.execute(args);

                            if(result!=null) {
                                if (!result.getClass().isArray()) {
                                    result = new Object[]{result};
                                }

                                //设置成 ACK 事件
                                sioPacket.setSocketType(3);
                                sioPacket.setData(JSON.toJSON(result));
                                return SIOParser.encode(sioPacket);
                            }
                        }
                    }

                    if (sioPacket.getSocketType() == SIOPacket.ACK) {
                        List argsList = (List) JSON.parse(sioPacket.getData());
                        String event = (String) argsList.get(0);
                        argsList.remove(0);
                        Object[] args = argsList.toArray(new Object[]{});

                        SIOHandler sioHandler = sioEventHandlers.get("ack_" + event);
                        sioHandler.setNsp(sioPacket.getNsp());
                        sioHandler.setEioHandler(this);
                        sioHandler.setSioDispatcher(sioDispatcher);
                        if (sioHandler != null) {
                            sioHandler.execute(args);
                        }
                    }
                }
            } catch(Exception e){
                Logger.error(e);
            }

            return null;
        }
    }


}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy