用java实现SCTP?

时间:2011-09-17 22:08:41

标签: java gateway sctp 3g-network

如何使用java在网关和服务器之间实现SCTP协议?

3 个答案:

答案 0 :(得分:0)

如果您的目标是Java 7,则永远不要尝试实现它。正如安德鲁和汤姆所说,它已经被实施为核心功能。

答案 1 :(得分:0)

不需要,只需使用 sctp

https://github.com/RestComm/sctp

处理大多数需求,效果很好。

答案 2 :(得分:-1)

Windows无法支持SCTP。如果想用windows plz安装sctp驱动程序。其他明智的使用linux添加简单的客户端服务器示例

Client.java

package mai;
import java.io.IOException;   
import java.net.InetAddress; 

import java.net.InetSocketAddress; 

import java.net.SocketAddress; 

import java.nio.ByteBuffer;

import com.sun.nio.sctp.MessageInfo;

import com.sun.nio.sctp.SctpChannel;


public class Client 
{

    public static void main(String[] args)
    { 
        try { 
            //SocketAddress socketAddress = new InetSocketAddress( 6050); 
            InetSocketAddress socketAddress = new InetSocketAddress("192.9.200.193", 4444);
            System.out.println("open connection for socket [" + socketAddress + "]"); 
            SctpChannel sctpChannel = SctpChannel.open(socketAddress, 1,1);  //(socketAddress, 1 ,1 ); 
            sctpChannel.bind(new InetSocketAddress(4444)); //6060
            sctpChannel.connect(socketAddress, 1 ,1);

            System.out.println("sctpChannel.getRemoteAddresses() = " + sctpChannel.getRemoteAddresses()); 
            System.out.println("sctpChannel.getAllLocalAddresses() = " + sctpChannel.getAllLocalAddresses()); 
            System.out.println("sctpChannel.isConnectionPending() = " + sctpChannel.isConnectionPending()); 
            System.out.println("sctpChannel.isOpen() = " + sctpChannel.isOpen()); 
            System.out.println("sctpChannel.isRegistered() = " + sctpChannel.isRegistered()); 
            System.out.println("sctpChannel.provider() = " + sctpChannel.provider()); 
            System.out.println("sctpChannel.association() = " + sctpChannel.association());

            System.out.println("send bytes"); 
            final ByteBuffer byteBuffer = ByteBuffer.allocate(64000); 
            //Simple M3ua ASP_Up message 
            byte [] message = new byte []{1,0,3,1,0,0,0,24,0,17,0,8,0,0,0,1,0,4,0,8,84,101,115,116};

            final MessageInfo messageInfo = MessageInfo.createOutgoing(null, 0); 
            System.out.println("messageInfo = " + messageInfo); 
            System.out.println("messageInfo.streamNumber() = " + messageInfo.streamNumber());

            byteBuffer.put(message); 
            byteBuffer.flip();  
              sctpChannel.send(byteBuffer, messageInfo); 

            System.out.println("close connection"); 
            sctpChannel.close();
System.in.read();
        } catch (Exception e) { 
            e.printStackTrace(); 
            try {
                System.in.read();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        } 
    } 
}

Server.java

package mai;
import java.io.IOException; 
import java.net.InetSocketAddress; 
import java.net.SocketAddress; 
import java.nio.ByteBuffer;
import java.util.Arrays;

import com.sun.nio.sctp.MessageInfo; 
import com.sun.nio.sctp.SctpChannel; 
import com.sun.nio.sctp.SctpServerChannel;

public class Server {
    static ByteBuffer rxBuffer;
    public static void main(String[] args)throws Exception {
        rxBuffer = ByteBuffer.allocateDirect(64000);

        rxBuffer.clear();
        rxBuffer.rewind();
        rxBuffer.flip();
    //  SctpChannel xx=SctpChannel.open();
        com.sun.nio.sctp.SctpChannel sc = com.sun.nio.sctp.SctpChannel.open(); 
        SocketAddress serverSocketAddress = new InetSocketAddress(4444); 
        System.out.println("create and bind for sctp address"); 
        SctpServerChannel sctpServerChannel =  SctpServerChannel.open().bind(serverSocketAddress); 
        System.out.println("address bind process finished successfully");

        SctpChannel sctpChannel; 
        while ((sctpChannel = sctpServerChannel.accept()) != null) { 
            System.out.println("client connection received"); 
            System.out.println("sctpChannel.getRemoteAddresses() = " + sctpChannel.getRemoteAddresses()); 
            System.out.println("sctpChannel.association() = " + sctpChannel.association()); 
            MessageInfo messageInfo = sctpChannel.receive(rxBuffer=ByteBuffer.allocateDirect(64000) , null, null); 
             int len= messageInfo.bytes();
            System.out.println("Server...      Total bytes recived "+len);
             System.out.println("Server...      "+messageInfo);
            rxBuffer.flip();
            byte[] data = new byte[len];
            rxBuffer.get(data);
            rxBuffer.clear();

                System.out.println("Server.....     data  "+Arrays.toString(data));
              System.out.println("Server.....    close connection"); 

        } 
    } 
}