我使用 Apache Mina 来设置一个非常简单的 TCP 服务器,它基本上绑定到 localhost 并且有一个 Mina Handler 来处理事件:
公共类服务器实例 {
public static void main(String[] args){
InetSocketAddress address=new InetSocketAddress(8085);
IoAcceptor ioAcceptor=new NioSocketAcceptor();
ioAcceptor.setHandler(new MinaNetworkHandler());
ioAcceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter(new TextLineCodecFactory()));
try{
ioAcceptor.bind(address);
}
catch(Exception e){
e.printStackTrace();
}
}
在MinaNetworkHandler中我实现了public void messageReceived(IoSession arg0, Object arg1)
:
public void messageReceived(IoSession arg0, Object arg1) throws Exception {
// TODO Auto-generated method stub
System.out.println("msg has received in session "+arg0.getId());
if(arg0.getId()==new Long(1)){
sessions.get(new Long(2)).write(arg1.toString());
}
else{
sessions.get(new Long(1)).write(arg1.toString());
}
//arg0.write("we have "+sessions.size()+" sessions");
}
我使用 hashmap 将会话限制在 TCP 服务器中的两个。
如果我在我的 mac 中使用 telnet,两个 telnet 客户端可以成功通信:
但是,如果我使用 Java Nio 的 SocketChannel 作为客户端,它无法接收/发送消息,但是如果我打开连接,会话将被打开(未创建),在我的示例客户端中,我使用 while 循环来检查通道是否可以将数据读取到 ByteBuffer:
public static void scatterRead() throws IOException{
SocketChannel channel=SocketChannel.open();
channel.connect(new InetSocketAddress("192.168.1.2",8085));
channel.configureBlocking(true);
ByteBuffer buf = ByteBuffer.allocate(1024);
buf.clear();
buf.flip();
while(true){
if(channel.read(buf)!=-1){
while(buf.hasRemaining()){
System.out.println((char)buf.get());
}
}
}
}
但是,它无法接收 msg(两个客户端,一个 java 客户端,一个 telnet):
**如您所见,即使我使用 telnet 发送 msg,在 java 客户端控制台中它也不会记录任何内容。但奇怪的是,在 ServerInstance 控制台中,我可以看到 java 客户端的会话已打开(但未创建)。