Server端
package com.chen.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;
import java.net.SocketAddress;
import java.util.Iterator;
/**
*服务器
*/
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 MinaServerHandler());
//定义端口号
int port = 9999;
try {
//绑定端口,启动服务器(不会阻塞,立即返回)
acceptor.bind(new InetSocketAddress(port));
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Mina Server Running,Listener on : "+port);
}
}
MinaServerHandler
package com.chen.mina;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
/**
* 服务器端的消息处理器
*/
public class MinaServerHandler 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);
}
}
Client端
package com.chen.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.nio.NioSocketConnector;
import java.net.InetSocketAddress;
import java.util.Scanner;
/**
* @date 2022/4/15--9:20
* 客户端
*/
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(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();
}
}
MinaClientHandler
package com.chen.mina;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
/**
* @date 2022/4/15--9:21
* 客户端消息处理器
*/
public class MinaClientHandler extends IoHandlerAdapter {
@Override
public void sessionOpened(IoSession session) throws Exception {
super.sessionOpened(session);
System.out.println("session Opened");
}
@Override
public void sessionClosed(IoSession session) throws Exception {
super.sessionClosed(session);
System.out.println("Session 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);
}
}
Message
package com.chen.mina;
import java.io.Serializable;
/**
* @date 2022/4/15--9:49
*/
public class Message implements Serializable {
private String from;
private String to;
private String type;
private String 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 + '\'' +
'}';
}
}