1、什麼是MINA?
一個簡潔易用的基於 TCP/IP 通信的 JAVA框架。
下載地址:
http://mina.apache.org/mina-project/downloads_old.html
一個簡單的網絡程序需要的最少jar包:mina-core-2.0.16.jar、slf4j-api-1.7.21.jar
開發一個 Mina 應用,簡單的說,就是創建連接,設定過濾規則,編寫自己的消息處理器
示例:
服務器端
package com.mina;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import java.io.IOException;
import java.net.InetSocketAddress;
public class Sever {
public static void main(String[] args) {
//創建一個非阻塞的服務端socket
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 MinaSeverHandler());
int port = 9999;
try {
//綁定端口號
acceptor.bind(new InetSocketAddress(port));
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("sever success running"+port);
客戶端:
package com.mina;
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.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketConnector;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
import java.net.InetSocketAddress;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
//創建連接
SocketConnector 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(10000);
//連接服務器
ConnectFuture cf = Connector.connect(new InetSocketAddress("localhost", 9999));
cf.awaitUninterruptibly();//等待連接成功
Scanner input = new Scanner(System.in);
// while (true){
// System.out.println("請輸入:");
// String info = input.nextLine();
// cf.getSession().write(info);
// }
while (true){
Message msg = new Message();
System.out.println("form:");
msg.setFrom(input.nextLine());
System.out.println("to:");
msg.setTo(input.nextLine());
System.out.println("info:");
msg.setInfo(input.nextLine());
msg.setType("send");
cf.getSession().write(msg);
}
//等待服務器關閉,結束長連接
//cf.getSession().getCloseFuture().awaitUninterruptibly();
//Connector.dispose();//關閉連接
}
}
服務器消息管理器:
package com.mina;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
public class MinaSeverHandler extends IoHandlerAdapter {
//一次會話被打開
@Override
public void sessionOpened(IoSession session) throws Exception {
super.sessionOpened(session);
System.out.println("welcome client"+session.getRemoteAddress());
}
//會話關閉
@Override
public void sessionClosed(IoSession session) throws Exception {
super.sessionClosed(session);
System.out.println("client closed");
}
//消息會話
@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);
session.write(msg);
}
}
客戶端消息管理器:
package com.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 {
super.sessionOpened(session);
System.out.println("sessionOpened");
}
@Override
public void sessionClosed(IoSession session) throws Exception {
super.sessionClosed(session);
System.out.println("sessionClosed");
}
@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);
}
}
對象:
package com.mina;
import java.io.Serializable;
//消息對象,消息對象要想在網絡中傳輸,需要實現Serializable接口實現對象序列化
public class Message implements Serializable {
private String from;//發送者
private String to;//接收者
private String type;//消息類型
private String info;//消息
public Message() {
}
public Message(String from, String to, String type, String info) {
this.from = from;
this.to = to;
this.type = type;
this.info = info;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
@Override
public String toString() {
return "Message{" +
"from='" + from + '\'' +
", to='" + to + '\'' +
", type=" + type +
", info='" + info + '\'' +
'}';
}
}