每天写篇博客。每天向某某打卡。保持热情,保持开心。
一.MINA框架:
Apache Mina是一个能够帮助用户开发高性能和高伸缩性网络应用程序的框架。它通过Java nio技术基于TCP/IP和UDP/IP协议提供了抽象的、事件驱动的、异步的API。
二.编写简单的MINA程序
- 程序目的:实现客户端与服务端的简单交互
- 程序效果:
- 源代码:
Server.java:
public class Server {
public static void main(String[] args) {
//创建一个非阻塞的serever端
SocketAcceptor acceptor = new NioSocketAcceptor();
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
//设置一个过滤器,一行一行的读取数据
chain.addLast("MyChain",new ProtocolCodecFilter(new TextLineCodecFactory()));
//设定过滤器以对象为读取单位
//chain.addLast("objectFilter",new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
//设置服务器端的消息处理器
acceptor.setHandler(new MinaServerHandler());
int port = 9998;
try {
//绑定端口,启动服务器(不会阻塞,立即返回)
acceptor.bind(new InetSocketAddress(port));
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Mina Server is running,listening on port:"+port);
}
}
MinaServerHandler.java:
public class MinaClientHandler extends IoHandlerAdapter {
@Override
public void sessionOpened(IoSession session) throws Exception {
super.sessionOpened(session);
System.out.println("我连接到服务器:" + session.getRemoteAddress() + "了");
}
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
super.messageReceived(session, message);
String info = (String) message;
System.out.println("服务器对我说:" + info);
// Message msg = (Message) message;
// System.out.println("收到"+msg.toString());
//session.write("收到了!辣鸡!");
}
@Override
public void sessionClosed(IoSession session) throws Exception {
super.sessionClosed(session);
System.out.println("会话关闭了");
}
}
Client.java:
public class Client {
public static void main(String[] args) {
//创建连接
NioSocketConnector connector = new NioSocketConnector();
DefaultIoFilterChainBuilder chain = connector.getFilterChain();
chain.addLast("mychain",new ProtocolCodecFilter(new TextLineCodecFactory()));
//设定过滤器以对象为读取单位
//chain.addLast("objectFilter",new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
connector.setHandler(new MinaClientHandler());
connector.setConnectTimeoutMillis(1000*10);
//连接服务器
ConnectFuture cf = connector.connect(new InetSocketAddress("localhost", 9998));
cf.awaitUninterruptibly();//等待连接成功
Scanner input = new Scanner(System.in);
while (true){
System.out.println("你要对服务器说什么?请输入:");
String info = input.nextLine();
//发送消息
cf.getSession().write(info);
// //以对象的方式传输数据
// Message msg = new Message();
// System.out.println("From:");
// msg.setFrom(input.nextLine());
// System.out.println("To:");
// msg.setTo(input.nextLine());
// System.out.println("info:");
// msg.setInfo(input.nextLine());
// System.out.println("type:");
// msg.setInfo("send");
// cf.getSession().write(msg);
}
//等待服务器连接关闭,结束长连接
//cf.getSession().getCloseFuture().awaitUninterruptibly();
//connector.dispose();
}
}
MinaClientHandler.java:
public class MinaServerHandler extends IoHandlerAdapter {
//一次回话打开
@Override
public void sessionOpened(IoSession session) throws Exception {
super.sessionOpened(session);
System.out.println("hello,client" + session.getRemoteAddress());
}
//一次回话结束
@Override
public void sessionClosed(IoSession session) throws Exception {
super.sessionClosed(session);
System.out.println("goodbye,client" + session.getRemoteAddress());
}
//接收消息的方法
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
super.messageReceived(session, message);//接收到的消息对象
String msg = (String) message;//
//Message msg = (Message) message;
System.out.println("收到客户端消息:" + msg);
//msg.setInfo("滚");
session.write("滚");//向客户端发送消息对象
}
}
message类:
public class Message implements Serializable {
private String From;
private String To;
private String Type;
private String info;
@Override
public String toString() {
return "Message{" +
"From='" + From + '\'' +
", To='" + To + '\'' +
", Type='" + Type + '\'' +
", info='" + info + '\'' +
'}';
}
....
}