每天寫篇博客。每天向某某打卡。保持熱情,保持開心。
一.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 + '\'' +
'}';
}
....
}