看到网上一个测试mina数据的帖子,根据它改出来一个代码例程,但是运行后客户端没有任何返回结果,代码是都能正确编译通过的,大家看看问题出在哪里,下:
客户端
------
/**
 * Create time 2010-2-25 下午04:26:14
 */
package test.nio.mina.sendData;import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.future.IoFutureListener;
import org.apache.mina.core.service.IoConnector;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.transport.socket.nio.NioSocketConnector;//源自http://topic.csdn.net/u/20080910/12/9538228d-0b18-40f3-96b8-c2221ac9f9cc.html
//其中Control,MyFilter类网上没有提供,是自己编写的
public class ClientHandler extends IoHandlerAdapter {
private static final String remoteAdd = "localhost";
private IoSession session;
private IoConnector connection; public ClientHandler() {
connection = new NioSocketConnector();
connection.setHandler(this);
ConnectFuture connFuture = connection.connect(new InetSocketAddress(
remoteAdd, ServerHandler.PORT));
connFuture.addListener(new IoFutureListener<ConnectFuture>() {
public void operationComplete(ConnectFuture future) {
if (future.isConnected()) {
session = future.getSession();
try {
sendData();
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("连接不存在");
}
}
});
} public void sendData() {
try {
StringBuffer sf = new StringBuffer();
sf.append("客户端数据");
IoBuffer buffer = IoBuffer.allocate(20480, true);// 分清楚direct和heap方式的缓冲区别
buffer.setAutoExpand(true);// 自动扩张
buffer.setAutoShrink(true);// 自动收缩
buffer.putString(sf.toString(), Charset.forName("gb2312").newEncoder());
buffer.flip();
buffer.free();
session.write(buffer); } catch (IOException e) {
e.printStackTrace();
} } @Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
super.exceptionCaught(session, cause);
} @Override
public void messageReceived(IoSession session, Object message)
throws Exception {
super.messageReceived(session, message);
} public static void main(String[] args) {
new ClientHandler();
}
}服务端
-----
package test.nio.mina.sendData;import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.executor.ExecutorFilter;
import org.apache.mina.transport.socket.nio.NioDatagramAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;public class ServerHandler extends IoHandlerAdapter {
public static final int PORT = 12345;
private NioSocketAcceptor tcpAcceptor;
private NioDatagramAcceptor udpAcceptor; public ServerHandler() {
Executor threadPool = Executors.newFixedThreadPool(1500);// 建立线程池
tcpAcceptor = new NioSocketAcceptor();
tcpAcceptor.getFilterChain().addLast("exector",new ExecutorFilter(threadPool));
tcpAcceptor.getFilterChain().addLast("myFilter", new MyFilter());
tcpAcceptor.setHandler(this);
// udpAcceptor = new NioDatagramAcceptor();
// udpAcceptor.getFilterChain().addLast("exector", new
// ExecutorFilter(threadPool));
// udpAcceptor.setHandler(this);
try {
tcpAcceptor.setBacklog(200);// 设置主服务监听端口的监听队列的最大值为100,如果当前已经有100个连接,再新的连接来将被服务器拒绝
tcpAcceptor.setReuseAddress(true);// 设置的是主服务监听的端口可以重用
// udpAcceptor.getSessionConfig().setReuseAddress(true);//设置每一个非主监听连接的端口可以重用
tcpAcceptor.getSessionConfig().setTcpNoDelay(true);// 设置为非延迟发送,为true则不组装成大包发送,收到东西马上发出
tcpAcceptor.getSessionConfig().setReceiveBufferSize(10240);// 设置输入缓冲区的大小
tcpAcceptor.getSessionConfig().setSendBufferSize(10240);// 设置输出缓冲区的大小
tcpAcceptor.setDefaultLocalAddress(new InetSocketAddress(PORT));
tcpAcceptor.bind();
System.out.println("启动服务器程序,端口["+PORT+"]");
} catch (IOException e) {
e.printStackTrace();
}
} @Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
System.out.println(cause);
session.close();
} @Override
public void messageReceived(IoSession session, Object message)
throws Exception {
IoBuffer buffer = (IoBuffer) message;
String recvMsg = buffer.getString(Charset.forName("gb2312").newDecoder());
buffer.free();
Control.DATANUM++;
System.out.println("收到消息" + recvMsg);
System.out.println(tcpAcceptor.getManagedSessionCount());
} public static void main(String[] args) {
new ServerHandler();
}
}
Control类
------
public final class Control {
  public static int DATANUM;
}MyFilter类
-------
che.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.core.write.WriteRequest;public class MyFilter implements IoFilter { @Override
public void destroy() throws Exception {
// TODO Auto-generated method stub

}
@Override
public void exceptionCaught(NextFilter arg0, IoSession arg1, Throwable arg2)
throws Exception {
// TODO Auto-generated method stub

}
@Override
public void filterClose(NextFilter arg0, IoSession arg1) throws Exception {
} @Override
public void filterWrite(NextFilter arg0, IoSession arg1, WriteRequest arg2)
throws Exception {
} @Override
public void init() throws Exception {
} @Override
public void messageReceived(NextFilter arg0, IoSession arg1, Object arg2)
throws Exception {
} @Override
public void messageSent(NextFilter arg0, IoSession arg1, WriteRequest arg2)
throws Exception {
} @Override
public void onPostAdd(IoFilterChain arg0, String arg1, NextFilter arg2)
throws Exception {
} @Override
public void onPostRemove(IoFilterChain arg0, String arg1, NextFilter arg2)
throws Exception {
} @Override
public void onPreAdd(IoFilterChain arg0, String arg1, NextFilter arg2)
throws Exception {
} @Override
public void onPreRemove(IoFilterChain arg0, String arg1, NextFilter arg2)
throws Exception { } @Override
public void sessionClosed(NextFilter arg0, IoSession arg1) throws Exception {
} @Override
public void sessionCreated(NextFilter arg0, IoSession arg1)
throws Exception {
} @Override
public void sessionIdle(NextFilter arg0, IoSession arg1, IdleStatus arg2)
throws Exception {
} @Override
public void sessionOpened(NextFilter arg0, IoSession arg1) throws Exception {
}}