第一次接触Mina框架,通过阅读相关博客和文档,自己总结下搭建的过程。
本次建立一个普通工程,也可以使用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;
/**
* Mina客户端
* @author 黄宝康
* 2017年9月30日 下午2:09:58
*/
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;
/**
* 客户端业务处理逻辑
*
* @author 黄宝康 2017年9月30日 下午2:48:24
*/
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;
/**
* Mina服务端
* @author 黄宝康
* 2017年9月30日 下午2:52:27
*/
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("客户端与服务端断开连接.....");
}
}
测试运行:
130

被折叠的 条评论
为什么被折叠?



