2012-08-09 9 views
2

Java 및 SCTP 프로토콜을 사용하여 일대 다 연결을 만들기 위해 Java에서 작업 중입니다.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(); 
    } 

이 내 클라이언트가 메시지를 전송 한 다음 새 메시지를 수신 대기 할 것입니다, 지금까지 한 일이다. 내가 목표로하는 것은 수신 거부 쿼리가 아닌 동일한 채널에서 메시지를 보내고받을 수 있도록 비 차단 방법을 사용하는 것입니다.

누구나이 경험이 있습니까?

최고의

, 헨릭

나는하여 messageInfo가 정확하지 말할 수있는 오류에서
+0

예외를 표시하십시오. – nos

+0

질문에 오류를 추가했습니다. – Hiny

답변

0

. 반복하지 않고 하나의 메시지 만 보내보십시오. 주소를 정적으로 설정하십시오.

또한 첫 번째 송신은 SctpMultiChannel의 경우 연결을 설정합니다. 연결이 설정되지 않았으므로 어떻게 연결을 루프 할 수 있습니까? 이것이 전체 코드입니까?