package com.mina;
import java.net.InetSocketAddress; import java.nio.charset.Charset; import org.apache.mina.core.service.IoAcceptor; import org.apache.mina.core.service.IoHandler; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSessionConfig; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.LineDelimiter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
public class MinaServer {
static int PORT = 7080;
static IoAcceptor accept = null;
public static void main(String[] args) throws Exception { accept = new NioSocketAcceptor();
/*Charset charSet = Charset.forName("UTF-8"); String encodingDelimiter = LineDelimiter.WINDOWS.getValue(); String decodingDelimiter = LineDelimiter.WINDOWS.getValue(); ProtocolCodecFactory codecFactory = new TextLineCodecFactory(charSet, encodingDelimiter, decodingDelimiter); IoFilter codecFilter = new ProtocolCodecFilter(codecFactory); accept.getFilterChain().addLast("codec", codecFilter);*/ //设置编码过滤器 accept.getFilterChain().addLast("codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue() ) ) ); IoSessionConfig sessionConfig = accept.getSessionConfig(); //设置读缓冲区的大小 sessionConfig.setReadBufferSize(1024); sessionConfig.setIdleTime(IdleStatus.BOTH_IDLE, 10); IoHandler myHandler = new MyServerHandler(); accept.setHandler(myHandler); accept.bind(new InetSocketAddress(PORT)); System.out.println("Server->" + PORT); }
} |
package com.mina;
import java.text.SimpleDateFormat; import java.util.Date;
import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession;
public class MyServerHandler extends IoHandlerAdapter {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override public void exceptionCaught(IoSession session, Throwable cause) throws Exception { System.out.println("exceptionCaught()"); }
@Override public void inputClosed(IoSession session) throws Exception { System.out.println("inputClosed()"); }
@Override public void messageReceived(IoSession session, Object message) throws Exception { String msg = (String)message; Date d = new Date(); String dateStr = sdf.format(d); System.out.println(dateStr + "服务器接受到数据:" + msg); if(msg.equals("exit")) { session.closeNow(); }else { session.write(dateStr); }
}
@Override public void messageSent(IoSession session, Object message) throws Exception { System.out.println("messageSent()"); }
@Override public void sessionClosed(IoSession session) throws Exception { System.out.println("sessionClosed()"); }
@Override public void sessionCreated(IoSession session) throws Exception { System.out.println("sessionCreated()"); }
@Override public void sessionIdle(IoSession session, IdleStatus status) throws Exception { System.out.println("sessionIdle()"); }
@Override public void sessionOpened(IoSession session) throws Exception { System.out.println("sessionOpened()"); }
} |
Server->7080
sessionCreated()
sessionOpened()
sessionIdle()
log4j:WARN No appenders could be found for logger (org.apache.mina.filter.codec.ProtocolCodecFilter).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
2018-11-26 21:21:22服务器接受到数据:hello
messageSent()
2018-11-26 21:21:25服务器接受到数据:world
messageSent()
2018-11-26 21:21:30服务器接受到数据:exit
sessionClosed()
客户端操作
package com.mina;
import java.net.InetSocketAddress; import java.nio.charset.Charset;
import org.apache.mina.core.future.ConnectFuture; import org.apache.mina.core.service.IoConnector; import org.apache.mina.core.service.IoHandler; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.LineDelimiter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.transport.socket.nio.NioSocketConnector;
public class MinaClient {
private static String HOST="localhost";
private static int PORT = 7080;
public static void main(String[] args) { IoSession session = null; IoConnector connector = new NioSocketConnector(); connector.setConnectTimeoutMillis(3000); //设置过滤器 connector.getFilterChain().addLast("codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue() ) ) ); IoHandler myHandler = new MyClientHandler(); connector.setHandler(myHandler); ConnectFuture future = connector.connect(new InetSocketAddress(HOST, PORT)); future.awaitUninterruptibly(); session = future.getSession(); session.write("你好,张飞"); session.getCloseFuture().awaitUninterruptibly();//等待关闭连接 connector.dispose(); }
} |
package com.mina;
import java.text.SimpleDateFormat; import java.util.Date; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IoSession;
public class MyClientHandler extends IoHandlerAdapter { private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Override public void exceptionCaught(IoSession session, Throwable cause) throws Exception { System.out.println("exceptionCaught()"); }
@Override public void messageReceived(IoSession session, Object message) throws Exception { String msg = (String)message; Date d = new Date(); String dateStr = sdf.format(d); System.out.println(dateStr + "客户端收到服务器发送回来的数据:" + msg); }
} |
服务器
Server->7080
sessionCreated()
sessionOpened()
log4j:WARN No appenders could be found for logger (org.apache.mina.filter.codec.ProtocolCodecFilter).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
2018-11-26 22:31:03服务器接受到数据:你好,张飞
messageSent()
sessionIdle()
sessionIdle()
sessionIdle()
客户端
log4j:WARN No appenders could be found for logger (org.apache.mina.filter.codec.ProtocolCodecFilter).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
2018-11-26 22:31:03客户端收到服务器发送回来的数据:2018-11-26 22:31:03