所以我目前正在研究一个客户端应用程序,该应用程序在端口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数据包通过多播地址发送。
问题原来是多播。请参阅Nikolai的回答。非常感谢!
答案 0 :(得分:2)
您需要创建一个新的ServerSocket类,然后使用accept()方法来使用当有人连接到您的侦听服务器/端口时创建的Socket。
ServerSocket server = new ServerSocket(5004);
Socket s = server.accept();
// You can now use the socket "s"...
答案 1 :(得分:2)
您必须使用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 );