用Java接收UDP数据
我试图通过PlayCap接收UDP数据广播到Java中的网络地址192.168.103.255端口3000,但设置时遇到问题。以下是我所拥有的:用Java接收UDP数据,java,sockets,networking,udp,Java,Sockets,Networking,Udp,我试图通过PlayCap接收UDP数据广播到Java中的网络地址192.168.103.255端口3000,但设置时遇到问题。以下是我所拥有的: DatagramSocket socket = new DatagramSocket(); InetSocketAddress address = new InetSocketAddress("192.168.103.255", 3000); socket.bind(address); 我从bind调用中得到“java.net.SocketExcep
DatagramSocket socket = new DatagramSocket();
InetSocketAddress address = new InetSocketAddress("192.168.103.255", 3000);
socket.bind(address);
我从bind调用中得到“java.net.SocketException:ready bind”。我在人际网络方面非常缺乏经验,所以我可能在这里做错了什么。感谢您的帮助
以下是stacktrace:
java.net.SocketException: already bound
at java.net.DatagramSocket.bind(Unknown Source)
at runner.main(runner.java:16)
检查端口3000,它可能已被其他应用程序使用。尝试使用其他端口。请使用
netstat-a-o-n
从中您可以发现此端口是否已绑定(即使通过此端口,您也可以获得所有绑定的端口)。如果是,请尝试任何其他端口:)您的应用程序可能运行了两次。或者您可能正在执行相同的代码两次。即使是同一个应用程序在绑定两次时也可能失败 对于初学者来说,发生了很多事情,他们没有关闭他们以前的尝试(我也发生过),然后他们的端口已经在使用中。确保添加正确的异常处理,例如弹出消息“端口已在使用中” 请注意,对于侦听,您通常只绑定一个端口,而不绑定显式地址(可能需要使用“0.0.0.0”)。然后您可以同时接收广播和单播 我用于收听广播的代码很简单:
DatagramSocket s = new DatagramSocket();
s.bind(new InetSocketAddress(port))
请注意,我没有绑定到特定地址,只是绑定到一个端口。我不想恢复旧线程,但我认为这个问题的答案不正确。当我使用类似的代码创建DatagramSocket时,我遇到了同样的问题
DatagramSocket socket = new DatagramSocket();
socket.setReuseAddress(true);
socket.bind(new InetSocketAddress(InetAddress.getByName("localhost"), 5566));
这将导致SocketException
Exception in thread "main" java.net.SocketException: already bound
at java.net.DatagramSocket.bind(DatagramSocket.java:376)
at testapplication.TestApplication.main(TestApplication.java:25)
Java结果:1
不是因为有另一个进程占用同一个端口,而是我在使用默认构造函数时创建了一个已绑定的数据报套接字
new DatagramSocket()
根据:
DatagramSocket()
构造一个数据报套接字并将其绑定到
本地主机
因此,出现异常的原因是您试图绑定一个已绑定的套接字。要使其工作,您需要使用下面的构造函数创建一个未绑定套接字
DatagramSocket socket = new DatagramSocket(null);
InetSocketAddress address = new InetSocketAddress("192.168.103.255", 3000);
socket.bind(address);
希望这有帮助……端口3000上已经有服务(可能是您程序的旧版本)正在侦听。I终止该进程或查找新端口。我运行了该命令,但未列出该端口(IP地址192.168.103.255或端口3000都未列出)。另外,我无法使用其他端口,因为我正在尝试从本地计算机上的PlayCap()接收正在广播的数据,而且我似乎无法指定要在哪个端口上广播。数据是否来自本地计算机?您是否通过InetSocketAddress address=new InetSocketAddress(“localhost”,3000)尝试过它;或InetSocketAddress address=新的InetSocketAddress(“127.0.0.1”,3000);192.168.103.255不是我的IP地址。根据WireShark的说法,这是数据的目标地址。我是否需要进行端口转发或禁用Windows防火墙?是的,我尝试了您的建议,但得到了相同的“已绑定”错误。确定,然后检查您的防火墙设置。您正在使用哪个操作系统?有一段时间,关闭防火墙,然后检查..我正在使用Windows7,我正在用EclipseJuno编程。我只是尝试关闭WIndows防火墙,但没有任何帮助。我只是尝试使用“0.0.0.0”并重新启动计算机,但两次都出现“已绑定”错误。根据WireShark,192.168.103.255是数据的目标地址。向我提供数据的人表示该地址是数据广播的地址(这不是我的IP地址)。我是否要正确接收此数据?无需重新启动。使用系统实用程序(例如,
netstat
)查看哪个进程正在侦听端口。不同的端口可以工作吗?如果所有端口都出现相同的错误,这是一个策略问题(windows防火墙等),或者您的应用程序绑定了两次,第二次失败。我运行了netstat,地址和端口没有列出。我尝试了不同的端口,但似乎无法绑定任何端口。我尝试的每个地址/端口都会给出相同的“已绑定”错误。我试着关闭Windows防火墙,但没用。我认为我不会绑定两次,因为我的应用程序实际上就是我在原始帖子中列出的代码(当然是在try-catch块中)。我还插入了您在帖子中列出的代码,但对于我尝试的任何端口,仍然会得到“已绑定”的代码!这太令人沮丧了!您使用哪个java版本?可能是沙盒之类的吗?你能用完整的stacktrace更新这个问题吗?我的Java版本是“1.7.0_09-b05”。我怎么知道它是不是沙盒?我添加了stacktrace,但不幸的是,我认为它不会很有帮助代码>谢谢!