首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的SCTP一对多

Java中的SCTP一对多
EN

Stack Overflow用户
提问于 2012-08-09 14:05:38
回答 1查看 1.5K关注 0票数 2

我正在使用Java创建一个使用Java和SCTP协议的一对多连接。

我已经启动并运行了一个SctpMultiChannel,我可以接收消息,但是是否需要执行一些特殊操作才能向所有连接发送消息?

代码语言:javascript
复制
The error message:

java.net.SocketException: Invalid argument
    at sun.nio.ch.SctpChannelImpl.send0(Native Method)
    at sun.nio.ch.SctpMultiChannelImpl.send0(SctpMultiChannelImpl.java:976)
    at sun.nio.ch.SctpMultiChannelImpl.sendFromNativeBuffer(SctpMultiChannelImpl.java:888)
    at sun.nio.ch.SctpMultiChannelImpl.send(SctpMultiChannelImpl.java:847)
    at sun.nio.ch.SctpMultiChannelImpl.send(SctpMultiChannelImpl.java:824)
    at org.test.MultiServer.run(MultiServer.java:56)

以及完整的代码:

代码语言:javascript
复制
SocketAddress serverSocketAddress = new InetSocketAddress(SOCKET_PORT);
    SctpMultiChannel smc;
    try {
      Logger.info("Start");
      smc = SctpMultiChannel.open().bind(serverSocketAddress);

      ByteBuffer buf = ByteBuffer.allocateDirect(160);
      Charset charset = Charset.forName("ISO-8859-1");
      CharsetDecoder decoder = charset.newDecoder();

      AssociationHandler assocHandler = new AssociationHandler();

      MessageInfo messageInfo;
      while ((messageInfo = smc.receive(buf, System.out, assocHandler)) != null) {
        Logger.debug(messageInfo.toString());
        buf.flip();
        Logger.debug(decoder.decode(buf).toString());
        Logger.info(smc.associations().size() + "");

        ByteBuffer buf1 = ByteBuffer.allocateDirect(60);
        CharBuffer cbuf1 = CharBuffer.allocate(60);
        charset = Charset.forName("ISO-8859-1");
        CharsetEncoder encoder = charset.newEncoder();
        cbuf1.put("foo").flip();
        encoder.encode(cbuf1, buf1, true);
        buf1.flip();

        for (Association ass : smc.associations()) {
          MessageInfo mi = MessageInfo.createOutgoing(ass, null, 1);
          smc.send(buf, mi);
        }
        cbuf1.clear();
        buf1.clear();
        buf1.flip();
      }
      smc.close();
    } catch (IOException e) {
      Logger.error("Server error");
      e.printStackTrace();
    }

这就是我到目前为止所做的,我的客户端发送一条消息,然后等待接收新消息。我的目标是有一种非阻塞的方法,这样我就可以在同一个通道上发送和接收消息,而不会阻塞接收查询。

有谁有这方面的经验吗?

最好的,亨里克

EN

回答 1

Stack Overflow用户

发布于 2017-06-05 14:46:08

从错误中我可以说MessageInfo不正确。尝试在不循环的情况下只发送一条消息。静态设置地址。

在SctpMultiChannel的情况下,第一次发送也会建立连接--既然没有建立关联,那么如何循环这些关联呢?这是整个代码吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11877608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档