Mina实战三:特定角色的Client处理消息

7 篇文章 0 订阅

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

本篇:Client收到消息后,判断消息头是否自己的角色名,如果是,则处理。角色Role在MinaClientHandler中。修改Role,启动多个Client测试。Client在控制台中Role:Message的格式给对应Role的Client发送Message。

package test3.type1;

import org.apache.mina.core.service.IoAcceptor;
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.NioSocketAcceptor;

import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import java.util.Collection;
import java.util.Scanner;

public class MinaServer {

    private static final int SERVER_PORT = 33220;

    private IoAcceptor acceptor;

    public boolean start() {
        try {
            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);
            acceptor.bind(new InetSocketAddress(SERVER_PORT));
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

        return true;
    }

    public void close(){
        acceptor.dispose();
    }

    public static void main(String[] args) {
        MinaServer minaServer = new MinaServer();
        minaServer.start();
    }

}
package test3.type1;

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());
        Collection<IoSession> ioSessionCollection = session.getService().getManagedSessions().values();
        for(IoSession ioSession : ioSessionCollection){
            if(session != ioSession){
                ioSession.write(message);
            }
        }
    }

    @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 test3.type1;

import com.google.gson.Gson;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.future.CloseFuture;
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.SocketConnector;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

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

public class MinaClient {

    private static final int SERVER_PORT = 33220;

    private SocketConnector connector;
    private ConnectFuture future;
    private IoSession session;

    public static void main(String[] args) {
        MinaClient minaClient = new MinaClient();
        if(minaClient.connect()){
            Scanner scanner = new Scanner(System.in);
            while (scanner.hasNext()) {
                // write(Object object);会使messageSent(IoSession session , Object message)执行
                String messageString = scanner.next();
                String[] messagePart = messageString.split("\\:");
                Message message = new Message();
                message.setMessageHead(messagePart[0]);
                message.setMessageBody(messagePart[1]);
                minaClient.session.write(new Gson().toJson(message));
            }
        }
    }

    public boolean connect(){
        try{
            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);
            future = connector.connect(new InetSocketAddress("localhost", SERVER_PORT));
            future.awaitUninterruptibly();
            session = future.getSession();
        }catch (Exception e) {
            e.printStackTrace();
            return false;
        }

        return true;
    }

    public boolean close() {
        CloseFuture future = session.getCloseFuture();
        future.awaitUninterruptibly(1000);
        connector.dispose();
        return true;
    }
}
package test3.type1;

import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
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 test3.type1.Message;

public class MinaClientHandler extends IoHandlerAdapter {

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

    private static final String ROLE = "B";

    @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());
        Message messageEntity;
        try{
            messageEntity = new Gson().fromJson(message.toString(), Message.class);
        }catch(JsonSyntaxException jsonSyntaxException){
            return;
        }

        if(messageEntity != null && messageEntity.getMessageHead().equals(ROLE)){
            logger.info("Deal_Message:" + messageEntity.getMessageBody());
        }
    }

    @Override
    public void messageSent(IoSession session, Object message) {
        logger.info("Server:" + 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("Server:" + session.getRemoteAddress() + " cause:" + cause.getMessage());
    }
}
package test3.type1;

public class Message {
    private String messageHead;

    private String messageBody;

    public String getMessageHead() {
        return messageHead;
    }

    public void setMessageHead(String messageHead) {
        this.messageHead = messageHead;
    }

    public String getMessageBody() {
        return messageBody;
    }

    public void setMessageBody(String messageBody) {
        this.messageBody = messageBody;
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风铃峰顶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值