2012-08-09 19 views
2

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

我已经启动了一个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(); 
    } 

这是我迄今所做的,我的客户端发送消息,然后去等待接收新的消息。 我的目标是有一个非阻塞的方法,所以我可以在同一个通道上发送和接收消息,而不是使用接收查询来阻塞。

任何人都有这方面的经验?

最好, 亨里克

+0

告诉我们这个例外。 – nos 2012-08-09 06:41:30

+0

在问题中添加了错误。 – Hiny 2012-08-09 12:42:46

回答

0

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

也是第一次发送建立连接的情况下SctpMultiChannel - 你怎么能够循环关联,因为他们没有建立?这是整个代码?