真羡慕java有系列的懒人框架,虽然c也有Netty, ACE等高速网络框架,但是语言的特性,决定了java框架之间更好集成,更加廉价。
上一个我的测试代码:
/**
*
*/
package com.jinbao.MinaDemo;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
/**
* @author zhuji06
*
*/
public class MinaService extends IoHandlerAdapter {
//有消息到达时会调用此方法
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
System.out.println("Server Received : " + message);
session.write("Im Server [" + System.currentTimeMillis() + "]");
}
//有消息即发送出去时会调用此方法
@Override
public void messageSent(IoSession session, Object message) throws Exception {
System.out.println("Server Sent : " + message);
}
public static void main(String[] args) throws IOException {
//1 创建服务端借口实例,服务端就是acceptor(貌似MINA3会改)
IoAcceptor acceptor = new NioSocketAcceptor();
//2 设置IoHandler,handler是处于上层的其直接对应逻辑处理
acceptor.setHandler(new MinaService());
//3 添加消息过滤器
acceptor.getFilterChain().addLast("decode", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
//4 设置session缓存大小
//5 设置连接空闲时间单位秒
//6 开始监听
acceptor.bind(new InetSocketAddress("localhost", 9696));
}
}
客户端:
/**
*
*/
package com.jinbao.MinaDemo;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoConnector;
import org.apache.mina.core.service.IoHandler;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
/**
* @author zhuji06
*
*/
public class MinaClient extends IoHandlerAdapter {
public static boolean received = false;
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
System.out.println("Client Received : " + message);
received = true;
}
@Override
public void messageSent(IoSession session, Object message) throws Exception {
System.out.println("Client Sent : " + message);
}
public static void main(String[] args) {
//1 客户端实例对应的接口是IoConnector
IoConnector connector = new NioSocketConnector();
//2 handler
IoHandler handler = new MinaClient();
connector.setHandler(handler);
//3 添加消息过滤器
connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
//4 开始连接服务器端
//这里和服务器端编码有所不同,由于MINA采用非阻塞模式,
//所以客户端连接服务端是非阻塞的,即connect()方法调用后执行线程会立即执行下面的代码。
//但connect()会返回一个ConnectFuture对象,使用它可以判断是否已经建立连接
ConnectFuture future = connector.connect(new InetSocketAddress("localhost", 9696));
//5 等待直到连接建立
future.awaitUninterruptibly();
//6 得到session
IoSession session = future.getSession();
//7 session.write()将一个对象发送出去,至于对象如何变成二进制那是编码解码器干的事情,后面会介绍的
session.write("Hello! i`m Client");
//等待服务器回馈的消息
while (!received) {
//消息还没来我就一直睡!睡啊睡!
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//8 关闭客户端连接
connector.dispose(true);
}
}