Mina实战一:建立Server和Client。有Client加入,Server广播给所有Client

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haoranhaoshi/article/details/89103348

Mina框架介绍:https://blog.csdn.net/haoranhaoshi/article/details/89102597
Mina实战一:建立Server和Client。有Client加入,Server广播给所有Client:https://blog.csdn.net/haoranhaoshi/article/details/89103348
Mina实战二:在控制台中Client可以给Sever和其他Client发送数据:https://blog.csdn.net/haoranhaoshi/article/details/89103887
Mina实战三:特定角色的Client处理消息:https://blog.csdn.net/haoranhaoshi/article/details/89103993
Mina实战四:特定角色收到消息:https://blog.csdn.net/haoranhaoshi/article/details/89108502
Mina实战五:Client启动时如果没有Server,就先建立Server:https://blog.csdn.net/haoranhaoshi/article/details/89108625
Mina实战六:不独立启动Server,Client通信:https://blog.csdn.net/haoranhaoshi/article/details/89109412
Mina实战工程下载:https://download.csdn.net/download/haoranhaoshi/11100668

package test1;

import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import java.util.Scanner;

public class MinaServer {

    private static final int SERVER_PORT = 33220;

    public static void main(String[] args) {
        IoAcceptor acceptor = new NioSocketAcceptor();
        acceptor.getFilterChain().addLast("MinaServer_ProtocolCodecFilter", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
        MinaServerHandler minaServerHandler = new MinaServerHandler();
        acceptor.setHandler(minaServerHandler);
        acceptor.getSessionConfig().setReadBufferSize(2048);
        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 30);
        try {
            acceptor.bind( new InetSocketAddress(SERVER_PORT) );
        }catch(IOException e){
            e.printStackTrace();
        }
    }

}
package test1;

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collection;

public class MinaServerHandler extends IoHandlerAdapter {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    private IoSession recentIoSession;

    @Override
    public void sessionCreated(IoSession session) {
        logger.info("Client:" + session.getRemoteAddress());
    }

    @Override
    public void sessionOpened(IoSession session) {
        logger.info("Client:" + session.getRemoteAddress());
        recentIoSession = session;
        Collection<IoSession> ioSessionCollection = session.getService().getManagedSessions().values();
        String minaClientCountInfo = "MinaClient_Count:" + ioSessionCollection.size();
        String recentIoSessionInfo = "recentIoSession:" + recentIoSession.getRemoteAddress();
        for (IoSession ioSession : ioSessionCollection) {
            ioSession.write(minaClientCountInfo + " " + recentIoSessionInfo);
        }
    }

    @Override
    public void sessionClosed(IoSession session) {
        logger.info("Client:" + session.getRemoteAddress());
    }

    @Override
    public void messageReceived(IoSession session, Object message) {
        logger.info("Client:" + session.getRemoteAddress() + " message:" + message.toString());
    }

    @Override
    public void messageSent(IoSession session, Object message) {
        logger.info("Client:" + session.getRemoteAddress() + " message:" + message.toString());
    }

    @Override
    public void sessionIdle(IoSession session, IdleStatus status) {
        logger.info("Server:" + session.getRemoteAddress() + " status:" + status.toString());
    }

    @Override
    public void exceptionCaught(IoSession session, Throwable cause) {
        logger.info("Client:" + session.getRemoteAddress() + " cause:" + cause.getMessage());
    }

}  
package test1;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

import java.net.InetSocketAddress;
import java.nio.charset.Charset;

public class MinaClient {

    private static final int SERVER_PORT = 33220;

    public static void main(String[] args) {
        NioSocketConnector connector = new NioSocketConnector();
        DefaultIoFilterChainBuilder chain = connector.getFilterChain();
        chain.addLast("MinaClient_ProtocolCodecFilter", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
        MinaClientHandler minaClientHandler = new MinaClientHandler();
        connector.setHandler(minaClientHandler);
        connector.setConnectTimeoutMillis(5000);
        connector.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 30);
        ConnectFuture future = connector.connect(new InetSocketAddress("localhost", SERVER_PORT));
        future.awaitUninterruptibly();
        IoSession ioSession = future.getSession();
        ioSession.getCloseFuture().awaitUninterruptibly();
        connector.dispose();
    }


}
package test1;

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MinaClientHandler extends IoHandlerAdapter {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public void sessionCreated(IoSession session) {
        logger.info("Server:" + session.getRemoteAddress());
    }

    @Override
    public void sessionOpened(IoSession session) {
        logger.info("Server:" + session.getRemoteAddress());
    }

    @Override
    public void sessionClosed(IoSession session) {
        logger.info("Server:" + session.getRemoteAddress());
    }

    @Override
    public void messageReceived(IoSession session, Object message) {
        logger.info("Server:" + session.getRemoteAddress() + " message:" + message.toString());
    }

    @Override
    public void messageSent(IoSession session , Object message) {
        logger.info("Server:" + session.getRemoteAddress() + " message:" + message.toString());
        session.write(message.toString());
    }

    @Override
    public void sessionIdle(IoSession session, IdleStatus status) {
        logger.info("Server:" + session.getRemoteAddress() + " status:" + status.toString());
    }

    @Override
    public void exceptionCaught(IoSession session, Throwable cause) {
        logger.info("Server:" + session.getRemoteAddress() + " cause:" + cause.getMessage());
    }
}

整个工程依赖的包:
gson-2.2.2
log4j-1.2.17
mina-core-2.0.7
slf4j-api-1.6.6
slf4j-log4j12-1.7.5

log4j.properties:

log4j.rootLogger=INFO,CONSOLE
log4j.addivity.org.apache=true
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.Threshold=INFO 
log4j.appender.CONSOLE.Target=System.out 
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
# log4j.appender.CONSOLE.layout.ConversionPattern=%d{HH:mm:ss,SSS} (%c is %M) (%m)%n
log4j.appender.CONSOLE.layout.ConversionPattern=%M %m%n

猜你喜欢

转载自blog.csdn.net/haoranhaoshi/article/details/89103348