客户端的传统IO和服务器的NIO,如果客户端在同一个套接字中发送多条消息,我如何获得特定的消息?

时间:2012-11-21 11:04:23

标签: java sockets nio apache-mina

我在服务器端使用Apache Mina。我有一个用传统IO编写的客户端。这是将数据发送到服务器的CLIENT端代码。

class SomeClass extends Thread
{
    Socket socket;

    //Constructor
    SomeClass()
    {
        Socket socket = ...
    }

    public void run()
    {
        while (j++ & lt; 10)
        {
            System.out.println("CLIENT[" + clientNo + "] Send Message =>" + requests[clientNo][j]);
            OutputStream oStrm = socket.getOutputStream();
            byte[] byteSendBuffer = (requests[clientNo][j]).getBytes();
            oStrm.write(byteSendBuffer);
            oStrm.flush();
        }
    }
}

以上线程运行20次。因此创建了20个套接字。在1个套接字中,发送了许多消息。使用IO套接字类编写的服务器,我能够完美地检索数据。

基于Apache Mina的服务器出现问题,该服务器使用BUFFER!我无法获得个人信息。

我如何获取个人消息(因为我无法在客户端更改任何内容,并且个别消息的长度未知)

服务器端代码
套接字创建

    public static void main(String[] args) throws IOException, SQLException {           
        System.out.println(Charset.defaultCharset().name());
        IoAcceptor acceptor = new NioSocketAcceptor();
        ProtocolCodecFilter(charset.newEncoder(),charset.newDecoder() ));
        acceptor.setHandler( new TimeServerHandler() );
        acceptor.getSessionConfig().setReadBufferSize(64 );
        acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );
        acceptor.bind( new InetSocketAddress(PORT) );
    }

处理程序代码

    public void messageReceived(IoSession session, Object message) throws Exception {
            AbstractIoBuffer bf = (AbstractIoBuffer)message;
            Charset charset = Charset.forName("UTF-8");
            CharsetDecoder decoder = charset.newDecoder();
            String outString = bf.getString(decoder);

    }

2 个答案:

答案 0 :(得分:1)

  

我如何获得个人信息

你没有。在TCP中没有消息这样的东西。它是一个字节流协议。没有消息边界,并且无法保证一次读取等于另一端的一次写入。

  

(因为我无法在客户端更改任何内容,并且个别消息的长度未知)

根据应用程序协议的定义,您将不得不解析消息以找到它们停止的位置。如果这是不可能的,因为,例如,协议是不明确的,客户端将不得不被废弃。然而,似乎你无法改变客户端,它必须已经可以使用现有的系统,所以在你遇到同样的问题并以某种方式解决它之前的那个人。

答案 1 :(得分:0)

MINA实际上是一个非常精细的框架,可以优雅地解决您的问题。它的基本概念是过滤器链,其中一系列过滤器应用于传入消息。

您应该实现协议解码器(实现MessageDecoder)并在MINA过滤器链中注册它。该解码器应该将字节缓冲区解析为您选择的对象表示。

然后,您可以注册处理完整消息的消息处理程序。