当前位置: 首页 > 知识库问答 >
问题:

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

澹台景山
2023-03-14

我正在服务器端使用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个套接字。在一个套接字中,发送许多消息。通过使用IO套接字类编写的服务器,我能够完美地检索数据。

问题出现在使用缓冲区的基于Apache Mina的服务器中!我无法获得单个消息。

我如何获得单个消息(如果我不能在客户端更改任何内容,并且单个消息的长度不知道)

服务器端代码
套接字创建

    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个答案

邢博涛
2023-03-14

MINA实际上是一个非常精细的框架,以一种优雅的方式解决你的问题。它的基本概念是一个过滤器链,在这个链中,一系列的过滤器被应用在一个传入的消息上。

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

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

秦阳旭
2023-03-14

如何获取单个消息

你不知道。TCP中没有消息这回事。它是一种字节流协议。没有消息边界,也不能保证另一端的一个读等于一个写。

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

您将不得不根据应用程序协议的定义解析消息以找到它们停止的位置。如果这是不可能的,因为,例如,协议是不明确的,客户端将不得不垃圾。然而,由于你不能改变客户机,它必须已经与一个现有的系统工作,所以在你之前的家伙有相同的问题,并解决了它。

 类似资料:
  • 关于使用Java套接字的例子有上百万个——每个都是一样的!每一个都显示了一个正在创建的客户机套接字,一些文本正在发送,并且套接字已关闭。 我正在编写一些测试代码。我希望我的客户端循环并发送相当多的消息。每次关闭客户端套接字并重新创建似乎很傻,所以我想我只创建一个客户端套接字,循环循环并在同一个套接字上发送数据。问题是——我的服务器套接字不会打印出它收到的内容,直到客户端发送最后一条消息并且客户端套

  • 我有套接字服务器(java桌面应用程序)正在等待从java webapp(套接字客户端)连接。通信看起来还可以,我在客户端看到来自服务器的消息,但是当我发送消息时,我在服务器端没有收到任何消息。会有什么问题呢?当我检查服务器与telnet,一切正常。下面是我的代码: 服务器: 客户: 谢谢帮忙!

  • 我有以下情况, TCP服务器将接受来自客户端的连接 客户端将发送第一个请求,服务器将响应该请求,服务器必须在同一套接字上等待接收来自同一客户端的下一个请求 请参阅我所做的代码,使用此代码,服务器无法接收服务器发送的第二个请求,而客户端也在第二个接收中接收来自服务器的第一个响应。 请对此提出建议,代码中的问题是什么。 我试着模拟这个案例,如果有人以前遇到过,请尽快建议。

  • 问题内容: 我将实现类似于Facebook通知和此网站的内容(StackOverflow的通知会通知我们是否有人为我们的问题写评论/答案等)。请注意,用户将使用我的应用程序作为网站而不是移动应用程序。 我遇到以下获取结果的答案,但我需要推送结果而不是获取结果。 根据建议,我在实体类中创建了一个简单方法,并向其中添加了@PostPersist,但此方法不起作用,因此基于此答案,我添加了persist

  • 我从插座开始。io节点。js,我知道如何在本地发送消息和广播函数:-所有连接的客户端都接收相同的消息。 现在,我想知道如何向特定客户端发送私人消息,我的意思是两个人之间的私人聊天(客户端到客户端流)的一个套接字。谢谢。

  • 问题内容: 所以现在,我正在制作一个基于客户端服务器应用程序的多线程。在服务器端,我为接受的每个连接创建了一个线程。 在线程类中,我创建了一种将命令发送到客户端的方法。我只想要的是如何将参数发送到所有正在运行的客户端?为简单起见,我只想使此服务器向所有连接的客户端发送消息。 我已经阅读了这篇文章,并从此链接中找到方法。但是,当我尝试使用自己的代码时,中没有类似的方法。 好的,这是我的服务器和线程示