【问题标题】:Java - Listening on a local port for RTP packetsJava - 在本地端口上侦听 RTP 数据包
【发布时间】:2012-11-09 19:27:50
【问题描述】:

所以我目前正在开发一个客户端应用程序,该应用程序在端口 5004 上侦听 RTP 数据包。由于可能有多个服务器发送 RTP 数据包,我不能使用套接字连接到特定的远程主机。相反,我尝试了以下方法来监听本地端口:

Socket socket = new Socket("127.0.0.1", 5004);
Socket socket = new Socket("localhost", 5004);
Socket socket = new Socket(InetAddress.getByName("localhost"), 5004);
Socket socket = new Socket(InetAddress.getLocalHost(), 5004);

以上任何一项都会给我这个例外:

java.net.ConnectException: Connection refused: connect

我也尝试过使用 DatagramSocket,但 DatagramPackets 要求我指定要读取的数据包的大小。

总而言之,我需要找到一种方法来在本地端口 5004 上侦听未知大小的 RTP 数据包,而无需连接到特定的远程主机/地址。非常感谢任何帮助!

编辑:

我现在设置了一个 ServerSocket 来监听连接,但我仍然无法读取任何数据包。

try {   ServerSocket server = new ServerSocket(5004);
        Socket s = server.accept();
        BufferedReader rtpReader = new BufferedReader(new InputStreamReader(s.getInputStream()));
        while (true){
            int k = rtpReader.read();
            if (k == -1) break;
            System.out.println(k);
        }
}

注意:RTP 数据包通过多播地址发送。

问题原来是多播。参考尼古拉的回答。非常感谢!

【问题讨论】:

  • 如果你在听,你应该使用ServerSocket

标签: java sockets rtp


【解决方案1】:

您必须使用java.net.MulticastSocket,并加入多播组。比如:

// put your multicast address here
InetAddress group = InetAddress.getByName( "244.10.10.10" );
MulticastSocket sock = new MulticastSocket( 5004 );
sock.joinGroup( group );

byte[] buf = new byte[1472];
DatagramPacket pack = new DatagramPacket( buf, buf.length );

while ( whatever ) {
    sock.receive( pack );
    // handle data
}

sock.leaveGroup( group );

【讨论】:

    【解决方案2】:

    您需要创建一个新的ServerSocket 类,然后使用accept() 方法来使用当有人连接到您的监听服务器/端口时创建的Socket。

    ServerSocket server = new ServerSocket(5004);
    Socket s = server.accept();
    // You can now use the socket "s"...
    

    【讨论】:

    • 你说的是 TCP,但 OP 需要多播 UDP。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 2016-04-29
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 2019-01-03
    相关资源
    最近更新 更多