Server:
package WangLuoTongXin.MinaDemo;
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 Server {
public static void main(String[] args) {
//创建一个非阻塞的Server端Socket NIO
SocketAcceptor acceptor = new NioSocketAcceptor();
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
//设定一个过滤器,一行一行的读取数据(标识符是 /r/n)
//chain.addLast("myChain",new ProtocolCodecFilter(new TextLineCodecFactory()));
//设定过滤器以对象为单位读取数据
chain.addLast("objectFilter",new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
//设置服务端的消息处理器
acceptor.setHandler(new ServerHandler());
int port = 9999;//服务端端口号
try {
//绑定端口,同时启动服务器(不会阻塞,立即返回)
acceptor.bind(new InetSocketAddress(port));
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Mina Server Running,Listener on :"+port);
}
}
ServerHandler:
package WangLuoTongXin.MinaDemo;
//服务器端的消息处理器
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
public class ServerHandler 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("echo:"+msg);
}
}
Message:
package WangLuoTongXin.MinaDemo;
public class Message {
private String from;
private String to;
private String type;
private String info;
public Message() {
}
@Override
public String toString() {
return "Message{" +
"from='" + from + '\'' +
", to='" + to + '\'' +
", type='" + type + '\'' +
", info='" + info + '\'' +
'}';
}
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;
}
}
Client:
package WangLuoTongXin.MinaDemo;
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.nio.NioSocketConnector;
import java.net.InetSocketAddress;
import java.util.Scanner;
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 ClientHandler());
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);
*/
//以对象的方式传输数据
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());
msg.setType("send");
cf.getSession().write(msg);
}
//等待服务器连接关闭,结束长连接
//cf.getSession().getCloseFuture().awaitUninterruptibly();意思是等待服务器关闭以后连接就失效了
//connector.dispose();关闭连接
}
}
ClientHandler
package WangLuoTongXin.MinaDemo;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
public class ClientHandler extends IoHandlerAdapter {
@Override
public void sessionOpened(IoSession session) throws Exception {
super.sessionOpened(session);
System.out.println("连接成功");
}
@Override
public void sessionClosed(IoSession session) throws Exception {
super.sessionClosed(session);
System.out.println("连接关闭");
}
@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);
}
}