2

Java と SCTP プロトコルを使用して 1 対多の接続を作成するために Java で作業しています。

SctpMultiChannel を起動して実行し、メッセージを受信できましたが、すべての接続にメッセージを送信するために何か特別なことをする必要がありますか?

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)

そして完全なコード:

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();
    }

これは私がこれまで行ってきたことです。私のクライアントはメッセージを送信し、新しいメッセージを受信するのを待ちます。私が目指しているのは、受信クエリでブロックするのではなく、同じチャネルでメッセージを送受信できるように、非ブロッキング アプローチを使用することです。

誰でもこれで経験がありますか?

最高、ヘンリック

4

1 に答える 1