我正在尝试通过PlayCap接收UDP数据广播到Java中的网络地址192.168.103.255端口3000,但是我在设置方面遇到了麻烦。这就是我所拥有的:
DatagramSocket socket = new DatagramSocket();
InetSocketAddress address = new InetSocketAddress("192.168.103.255", 3000);
socket.bind(address);
我从绑定调用得到“java.net.SocketException:已绑定”。我对网络很缺乏经验,所以我可能在这里做错了。任何帮助表示赞赏。
这是stacktrace:
java.net.SocketException: already bound
at java.net.DatagramSocket.bind(Unknown Source)
at runner.main(runner.java:16)
答案 0 :(得分:17)
我不想复活和旧帖,但我不认为这个问题的答案是正确的。当我使用类似的代码创建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
不是因为有另一个进程占用同一个端口,但是当我使用默认构造函数时,我已经创建了一个已经 BOUND 数据报套接字。
new DatagramSocket()
根据javadoc:
DatagramSocket的() 构造一个数据报套接字并将绑定它到任何可用的端口上 本地主机。
因此,异常的原因是您正在尝试绑定已绑定的套接字。要使其工作,您需要使用下面的构造函数
创建一个unbond套接字DatagramSocket socket = new DatagramSocket(null);
InetSocketAddress address = new InetSocketAddress("192.168.103.255", 3000);
socket.bind(address);
希望这会有所帮助......
答案 1 :(得分:1)
执行 netstat -a -o -n
从这里你可以发现这个端口是否已经绑定(即使从这个端口你可以得到所有的绑定端口)。如果是,则尝试任何其他端口:)
答案 2 :(得分:1)
很可能您的应用程序运行了两次。或者您可能两次执行相同的代码。绑定两次时,即使是相同的应用程序也可能会失败。
初学者发生了很多事情,他们没有关闭他们之前的尝试(也发生在我身上),然后他们的端口已经被使用了。确保添加适当的异常处理,例如通过弹出消息“端口已在使用中。”
请注意,对于 listen ,您通常只会绑定一个端口,而没有明确的地址(您可能需要使用“0.0.0.0”)。然后你可以接收广播和单播。
我用来收听广播的代码很简单:
DatagramSocket s = new DatagramSocket();
s.bind(new InetSocketAddress(port))
请注意,我没有绑定到特定地址,只绑定到端口。
答案 3 :(得分:0)
检查端口3000,它可能已被其他应用程序使用。尝试使用其他端口。