0

我使用 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 客户端的会话已打开(但未创建)。

在此处输入图像描述

4

0 回答 0