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

com.ursful.framework.mina.server.UrsServer Maven / Gradle / Ivy

package com.ursful.framework.mina.server;

import com.ursful.framework.mina.client.UrsClient;
import com.ursful.framework.mina.common.InterfaceManager;
import com.ursful.framework.mina.common.tools.DateUtils;
import com.ursful.framework.mina.common.tools.NetworkUtils;
import com.ursful.framework.mina.server.cluster.listener.IClusterClientStatus;
import com.ursful.framework.mina.server.mina.ServerHandler;
import com.ursful.framework.mina.server.mina.coder.CodecFactory;
import com.ursful.framework.mina.server.mina.packet.PacketProcessor;
import com.ursful.framework.mina.server.tools.TimerManager;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.buffer.SimpleBufferAllocator;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class UrsServer implements Runnable{

    public static long systemTimeDifference;

    private static Logger logger = LoggerFactory.getLogger(UrsServer.class);


    public List ipPortList = new ArrayList();
    private boolean enableTransfer;
    public void setClusterIps(String ips){
        ipPortList.clear();
        if(ips != null && !"".equals(ips)) {
            String[] ip = ips.split(",");
            for(String ipStr : ip){
                String[] ipAndPort = ipStr.split(":");
                if(ipAndPort.length == 2) {
                    ipPortList.add(new InetSocketAddress(ipAndPort[0], Integer.parseInt(ipAndPort[1])));
                }
            }
        }
    }

    public void enableTransfer(boolean flag){
        this.enableTransfer = flag;
    }

    private int port;
    private String sid;
    private NioSocketAcceptor acceptor;

    public int getPort() {
        return port;
    }

    public UrsServer(String sid, int port) {
    	this.port = port;
        this.sid = sid;
    }

    private Map ursClientMap = new HashMap();

    @Override
    public void run() {

        if(enableTransfer) {
            InterfaceManager.register(new IClusterClientStatus() {
                @Override
                public void serverClientReady(String cid, String host, int port) {
                    List ips = NetworkUtils.getHostAddress();
                    ips.add("127.0.0.1");
                    ips.add("localhost");
                    if(ips.contains(host) && getPort() == port){
                        return;
                    }
                    String key = host + ":" + port;
                    if(!ursClientMap.containsKey(key)){
                        logger.info(cid + "-----------serverClientReady. add new........" + key);
                        UrsClient c = new UrsClient(sid, host, port);
                        c.getMetaData().put("SERVER_PORT", getPort());
                        c.enableCluster(true);
                        c.run();
                        ursClientMap.put(key, c);
                    }else{
                        logger.info(cid + "-----------serverClientReady. not add........" + key);
                    }
                }

                @Override
                public void serverClientClose(String cid, String host, int port) {
                    String key = host + ":" + port;
                    UrsClient c = ursClientMap.get(key);
                    if(c != null) {
                        logger.info(cid + "-----------serverClientClose..remove......." + key);
                        c.close();
                        ursClientMap.remove(key);
                    }else{
                        logger.info(cid + "-----------serverClientClose..not exist......." + key);
                    }

                }
            });
        }

        IoBuffer.setUseDirectBuffer(false);
        IoBuffer.setAllocator(new SimpleBufferAllocator());
        try {
            ServerHandler serverHandler = new ServerHandler(sid, PacketProcessor.getProcessor());
            acceptor = new NioSocketAcceptor(Runtime.getRuntime().availableProcessors());
            acceptor.getSessionConfig().setTcpNoDelay(true);
            acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new CodecFactory()));
            acceptor.setHandler(serverHandler);
            acceptor.bind(new InetSocketAddress(port));
            logger.info("端口 :" + port);

            if(enableTransfer){
                List ip = NetworkUtils.getHostAddress();
                for(InetSocketAddress address : ipPortList){
                    if(("localhost".equals(address.getHostName())
                         || "127.0.0.1".equals(address.getHostName())
                         || ip.contains(address.getHostName()))
                            && this.port == address.getPort()){
                        continue;
                    }
                    UrsClient client = new UrsClient(this.sid, address.getHostName(), address.getPort());
                    client.enableCluster(true);
                    client.getMetaData().put("SERVER_PORT", this.port);
                    ursClientMap.put(address.getHostName() + ":" + address.getPort(), client);
                    client.run();
                }
            }
        } catch (IOException e) {
            logger.error(e.getMessage(), e);
        }

        TimerManager manager = TimerManager.getInstance();
        manager.register(new Runnable() {
            @Override
            public void run() {
                System.gc();
                logger.info("System.gc");
            }
        }, 24*3600*1000, DateUtils.getTimeMillisToNextDate());//每天一次垃圾回收。
    }



}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy