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;
}
}