引入两个jar包 :
mina-core-2.0.3.jar
slf4j-api-1.6.0.jar
服务端编写 : Server和handler
Server:
public class MyServer { public static void main(String[] args) throws IOException { // 初始化了服务端的TCP/IP 的基于NIO 的套接字 //IoAcceptor的抽象是IoServivce :服务端 IoAcceptor acceptor = new NioSocketAcceptor(); // 调用IoSessionConfig设置读取数据的缓冲区大小 acceptor.getSessionConfig().setReadBufferSize(2048); // 读写通道均在10 秒内无任何操作就进入空闲状态 acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); // 在bind前执行的准备工作 // TextLineCodecFactory 编解码器工厂来对字符串进行编解码处理。 acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue()))); acceptor.setHandler(new MyIoHandler()); acceptor.bind(new InetSocketAddress(9123)); } }
handler :
public class MyIoHandler extends IoHandlerAdapter{ // 这里我们使用的SLF4J作为日志门面,至于为什么在后面说明。 private final static Logger log = LoggerFactory.getLogger(MyIoHandler.class); @Override public void messageReceived(IoSession session, Object message) throws Exception { String str = message.toString(); //简单打印客户端传过来的数据 System.out.println("The message received is [" + str + "]"); if (str.endsWith("quit")) { session.close(true); return; } } @Override public void sessionCreated(IoSession session) throws Exception { System.out.println("session create"); } @Override public void sessionClosed(IoSession session) throws Exception { System.out.println("session closed"); } }
客户端编写 :client 和handler
client:
public class MyClient { //编写IoService并注册过滤器 public static void main(String[] args) { //IoConnector的抽象是IoServivce:客户端 IoConnector connector = new NioSocketConnector(); connector.setConnectTimeoutMillis(30000); connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue()))); //为IoService注册Handler connector.setHandler(new ClientHandler("你好!\r\n 大家好!")); connector.connect(new InetSocketAddress("localhost", 9123)); } }
handler:
public class ClientHandler extends IoHandlerAdapter{ private final static Logger LOGGER = LoggerFactory.getLogger(ClientHandler.class); private final String values; public ClientHandler(String values) { this.values = values; } @Override public void sessionOpened(IoSession session) throws Exception { session.write(values); } }
mina重要对象介绍 :
IoService对象
//IoService的常用方法 //获取传输方式的元数据描述信息,也就是底层到底基于什么的实现,譬如:nio、apr 等。 TransportMetadata transportMetadata = connector.getTransportMetadata(); //增加删除一个监听器:监听IoService 的创建、活动、失效、空闲、销毁 //参考IoServiceListener 接口中的方法,这为你参与IoService 的生命周期提供了机会 connector.addListener(null); connector.removeListener(null); //获取IoService上管理的所有IoSession,Map的key是IoSession的id Map<Long ,IoSession> maps = connector.getManagedSessions(); //获取IoSession的配置对象:读数据的缓存大小,多少秒进入空闲状态 connector.getSessionConfig(); //1.IoAcceptor 服务端的IoService 增加bind端口方法 //2.IoConnector 客户端的IoService 增加connect与server建立连接
IoSession对象
//IoSession : 这个接口用于表示Server 端与Client 端的连接 @Override public void sessionOpened(IoSession session) throws Exception { //这个方法用于写数据,该操作是异步的。 session.write(values); //关闭IoSession,该操作也是异步的,参数指定true 表示立即关闭,否则就在所有的写操作都flush 之后再关闭。 session.close(); //向会话中添加一些属性,这样可以在会话过程中都可以使用, //类似于HttpSession 的setAttrbute()方法。IoSession 内部使用同步的HashMap 存储你添加的自定义属性。 session.setAttribute("设置属性"); //获取远端连接的套接字地址 session.getRemoteAddress(); //用于挂起写操作,那么有void resumeWrite()方法与之配对。对于read()方法同样适用。 session.suspendWrite(); //用于读取数据, 但默认是不能使用的, 你需要调用IoSessionConfig 的 //setUseReadOperation(true)才可以使用这个异步读取的方法。一般我们不会用到这个方法, //因为这个方法的内部实现是将数据保存到一个BlockingQueue,假如是Server 端,因为大 //量的Client 端发送的数据在Server 端都这么读取,那么可能会导致内存泄漏,但对于 //Client,可能有的时候会比较便利。 // session.read(); //返回与当前会话对象关联的IoService 实例 session.getService(); }
时间: 2024-10-01 05:26:54