Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java接收UDP数据_Java_Sockets_Networking_Udp - Fatal编程技术网

用Java接收UDP数据

用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

我试图通过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.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,但不幸的是,我认为它不会很有帮助谢谢!