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 + '\'' +
'}';
}
}