本文共 5209 字,大约阅读时间需要 17 分钟。
本次建立一个普通工程,也可以使用maven。
jar包引入:只需要引入图上4个jar即可。
Mina客户端代码:
package com.hbk.mina;import java.net.InetSocketAddress;import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;import org.apache.mina.core.future.ConnectFuture;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.filter.codec.textline.TextLineCodecFactory;import org.apache.mina.transport.socket.nio.NioSocketConnector;public class MinaClient { public static void main(String[] args) { // 创建TCP/IP连接 NioSocketConnector connection = new NioSocketConnector(); // 创建接受收据的过滤器 DefaultIoFilterChainBuilder chain = connection.getFilterChain(); // 往过滤器链的最后加入一个一行一行读取数据的过滤器 chain.addLast("mychin", new ProtocolCodecFilter(new TextLineCodecFactory())); // 客户端消息处理器 connection.setHandler(new MinaClientHandler()); // 设置超时时间 connection.setConnectTimeout(5000); // 连接到服务器 ConnectFuture cf = connection.connect(new InetSocketAddress("localhost", 8080)); // 等待连接完成 cf.awaitUninterruptibly(); cf.getSession().getCloseFuture().awaitUninterruptibly(); connection.dispose(); }}
客户端业务处理
package com.hbk.mina;import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IoSession;public class MinaClientHandler extends IoHandlerAdapter { // 当客户端连接进入时 @Override public void sessionOpened(IoSession session) throws Exception { System.out.println("incomming 客户端: " + session.getRemoteAddress()); session.write("i am coming"); } @Override public void exceptionCaught(IoSession session, Throwable cause) throws Exception { System.out.println("客户端发送信息异常...."); } // 当客户端发送消息到达时 @Override public void messageReceived(IoSession session, Object message) throws Exception { System.out.println("服务器返回的数据:" + message.toString()); } @Override public void sessionClosed(IoSession session) throws Exception { System.out.println("客户端与服务端断开连接....."); } @Override public void sessionCreated(IoSession session) throws Exception { System.out.println("one Client Connection" + session.getRemoteAddress()); session.write("我来了······"); }}
服务端
package com.hbk.mina;import java.net.InetSocketAddress;import java.nio.charset.Charset;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.filter.logging.LoggingFilter;import org.apache.mina.transport.socket.nio.NioSocketAcceptor;public class MinaServer { // 服务器监听端口 private static final int PORT = 8080; public static void main(String[] args) { // 服务器端的主要对象 IoAcceptor acceptor = new NioSocketAcceptor(); // 设置过滤器 acceptor.getFilterChain().addLast("logger", new LoggingFilter()); // 协议解析,采用mina现成的UTF-8字符串处理方式 acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8")))); // 设置消息处理类(创建、关闭Session,可读可写等等,继承自接口IoHandler) acceptor.setHandler(new TimeServerHandler()); // 设置接受缓冲区大小 acceptor.getSessionConfig().setReadBufferSize(2048); // 读写通道无任何操作就进入空闲状态 acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); try { // 服务器开始监听 acceptor.bind( new InetSocketAddress(PORT) ); }catch(Exception e){ e.printStackTrace(); } }}
服务端处理类
package com.hbk.mina;import java.util.Date;import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IoSession;public class TimeServerHandler extends IoHandlerAdapter { @Override public void exceptionCaught(IoSession session, Throwable cause) throws Exception { cause.printStackTrace(); } /* * 这个方法是目前这个类里最主要的, 当接收到消息,只要不是quit,就把服务器当前的时间返回给客户端 如果是quit,则关闭客户端连接 */ @Override public void messageReceived(IoSession session, Object message) throws Exception { String str = message.toString(); if (str.trim().equalsIgnoreCase("quit")) { session.close(); return; } Date date = new Date(); System.out.println("hello" + str + session.getRemoteAddress() + date.toString()); session.write("huangbaokang"); System.out.println("Message written..."); } @Override public void sessionClosed(IoSession session) throws Exception { // TODO Auto-generated method stub super.sessionClosed(session); System.out.println("客户端与服务端断开连接....."); }}
测试运行: