1、对象序列化
package com.lemon.MINA;
import java.io.Serializable;
/**
* 消息对象:
*
* @author lemonsun
*/ //对象序列化
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 + '\'' +
'}';
}
}
2、服务器
package com.lemon.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;
/**
* MINA服务器:
*
* @author lemonsun
*/
public class Server {
public static void main(String[] args) {
//1、创建一个非阻塞的Server端Socket NIO
SocketAcceptor acceptor = new NioSocketAcceptor();
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain(); //获取过滤链
//2、设定一个过滤器,一行一行读取数据(/r/n)
// chain.addLast("Mychain",new ProtocolCodecFilter(new TextLineCodecFactory()));
//设定对象过滤器
chain.addLast("objectFilter",new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
/*3、创建一个消息处理器类*/
//4、设置服务器端的消息处理器
acceptor.setHandler(new MinaServerHandler());//MinaServerHandler自定义的消息处理器
int port = 9999; //服务器端口号
try {
//绑定端口,启动服务器 ( 不会阻塞,立即返回)
acceptor.bind(new InetSocketAddress(9999));
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("MINA服务器已启动,正在监听"+ port +"等待连接...");
}
}
3、服务器消息处理器
package com.lemon.MINA;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
/**
* 服务器端的消息处理器:
*
* @author lemonsun
*/
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
Message msg = (Message)message; //接受到的消息对象
System.out.println("接受到客户端发来的消息:" + msg);
msg.setInfo("吃好吃的!");
session.write(msg); //向给客户端发送消息对象
}
}
4、客户端
package com.lemon.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;
/**
* Mina客户端:
*
* @author lemonsun
*/
public class Client {
public static void main(String[] args) {
//创建连接 nio
NioSocketConnector connector = new NioSocketConnector(9999);
DefaultIoFilterChainBuilder chain = connector.getFilterChain();
//字符串添加过滤器,也可以发送对象 对象过滤器
//chain.addLast("myChin",new ProtocolCodecFilter(new TextLineCodecFactory()));
//设定对象过滤器
chain.addLast("objectFilter",new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
//设置Handler
connector.setHandler(new MinaClientHandler());//设置自定义的Handler
connector.setConnectTimeoutMillis(1000*10); //连接失效时间10秒
//连接服务器
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 message = new Message();
System.out.println("from:");
message.setFrom(input.nextLine());
System.out.println("to:");
message.setTo(input.nextLine());
System.out.println("info:");
message.setInfo(input.nextLine());
message.setType("send");
//发送消息
cf.getSession().write(message);
}
//等待服务器连接关闭,结束长连接
// cf.getSession().getCloseFuture().awaitUninterruptibly();
//connector.dispose(); //关闭连接
}
}
5、客户端消息处理器
package com.lemon.MINA;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
/**
* 客户端消息处理器:
*
* @author lemonsun
*/
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);
Message msg = (Message)message;
System.out.println(msg); //接受服务器发来的消息
}
}