0

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

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 套接字类编写的服务器,我能够完美地检索数据。

问题出现在使用 BUFFER 的基于 Apache Mina 的服务器中!我无法收到个别消息。

我如何获取单个消息(鉴于我无法更改客户端中的任何内容,并且单个消息的长度未知)

服务器端代码
套接字创建

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

处理程序代码

    公共无效消息接收(IoSession 会话,对象消息)抛出异常 {
            AbstractIoBuffer bf = (AbstractIoBuffer) 消息;
            Charset charset = Charset.forName("UTF-8");
            CharsetDecoder 解码器 = charset.newDecoder();
            String outString = bf.getString(decoder);

    }
4

2 回答 2

1

如何获取个人消息

你没有。TCP 中没有消息之类的东西。它是一个字节流协议。没有消息边界,也不能保证在另一端一次读取等于一次写入。

(鉴于我无法更改客户端中的任何内容,并且单个消息的长度未知)

您将不得不解析消息以根据应用程序协议的定义找到它们停止的位置。如果因为协议不明确而无法做到这一点,那么客户端将不得不被丢弃。但是,由于您无法更改客户端,它似乎已经可以与现有系统一起使用,因此您之前的那个人遇到了同样的问题并以某种方式解决了它。

于 2012-11-21T22:52:15.537 回答
0

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

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

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

于 2012-11-21T11:36:24.023 回答