MINA接收数据。
MINA有几个方法,由事件触发。如messageReceived。当接收消息时候执行之。这点与Twisted有点像。
下面是一个简单接收打印的demo。
package server.test;
import java.nio.ByteBuffer;
import java.util.Date;
import org.apache.log4j.Logger;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import server.log.LoggerFactory;
import server.tcp.receive.ChannelBuffer;
public class ProjectHandle extends IoHandlerAdapter {
private Logger logger = LoggerFactory.initLogger();
@Override
public void exceptionCaught(IoSession session, Throwable cause) {
// System.out.println("session closed from " +
// session.getRemoteAddress());
logger.error("session closed from " + session.getRemoteAddress());
session.close(true);
}
@Override
public void sessionOpened(IoSession session) throws Exception {
Date date = new Date();
System.out.println("the session has opened for "
+ session.getRemoteAddress() + "/" + date.toString());
}
@Override
public void sessionClosed(IoSession session) throws Exception {
session.close(true);
Date date = new Date();
System.out.println("session closed from " + session.getRemoteAddress()
+ "/" + date.toString());
}
@Override
public void messageReceived(IoSession session, Object msg) throws Exception {
IoBuffer buf = (IoBuffer) msg;
ByteBuffer bf = buf.buf();
byte[] tmpBuffer = new byte[bf.limit()];
bf.get(tmpBuffer);
processPacket(session, tmpBuffer);
}
private void processPacket(IoSession session, byte[] newData) {
if (newData.length == 0) {
session.removeAttribute("buffer");
session.close(true);
} else {
Object buffer = session.getAttribute("buffer");
ChannelBuffer cBuffer = new ChannelBuffer();
if (buffer != null) {
cBuffer = (ChannelBuffer) buffer;
}
// cBuffer.setBuffer(newData,session);
for (byte b : newData) {
System.out.print(b);
}
System.out.println();
session.removeAttribute("buffer");
session.setAttribute("buffer", cBuffer);
}
}
}
完整源码包如下。
telnet 127.0.0.1 9090即可。