【发布时间】:2015-09-04 17:57:41
【问题描述】:
我希望我的客户端应用程序能够连接到服务器应用程序。
问题是我的客户端不知道服务器 ip(在 LAN 中)。
所以我尝试使用java对象MulticastSocket。幸运的是,Oracle 有一个带有 example of Broadcasting 的页面。
这里我已经重新安排了它以供我使用。
服务器代码:
long FIVE_SECONDS = 5000;
int port = 4445;
DatagramSocket socket = new DatagramSocket(port);
while (true) {
System.out.println("Server running...");
try {
// message for client
String dString = "Hello Client";
byte[] buf = dString.getBytes();
// send
InetAddress group = InetAddress.getByName("230.0.0.1");
DatagramPacket packet = new DatagramPacket(buf, buf.length, group, port);
socket.send(packet);
// sleep for a while
try {
Thread.sleep((long)(Math.random() * FIVE_SECONDS));
}
catch (InterruptedException e) {
System.err.println("Interrupted Exception");
}
} catch (IOException e) {
System.err.println("IOException");
}
}
客户端代码:
MulticastSocket socket = new MulticastSocket(4445);
InetAddress address = InetAddress.getByName("230.0.0.1");
socket.joinGroup(address);
// receive the message
byte[] buf = new byte[256];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
String received = new String(packet.getData(), 0, packet.getLength());
System.out.println("Received: " + received);
socket.leaveGroup(address);
socket.close();
当我运行 Srver 时:没问题,但是当我尝试运行客户端时它抛出 java.net.BindException: Address already in use 导致客户端和服务器都在 port 4445 上侦听/发送信息。
但不是吗? 要相互连接,它们必须具有相同的端口号,否则它们将永远不会“相遇”。
我可以解决这个问题吗?怎么样?
端口号是否正确?
这是对未知服务器 ip 问题的正确解决方案吗?
谢谢!
【问题讨论】:
-
虽然我无法回答这个问题,但同一端口上的两个侦听器将无法正常工作。一个端口就像一个 IO 流,当有两个写入器/读取器时,就会发生不好的事情。这就是为什么抛出
BindException以防止坏事发生的原因。 -
@WorldSEnder :可能你是对的,但是在我的问题(和here)中链接的 Oracle 示例中,它们使用相同的端口号......
-
你运行了他们的例子吗?如果不是,您的客户端和服务器是否在同一台计算机上?如果是,那我可以解释问题,如果不是,我不知道
-
@WorldSEnder 是的,我在同一台计算机上使用客户端和服务器运行他们的示例。它会影响什么吗?
-
“但不是吗?要相互连接,它们必须具有相同的端口号,否则它们将永远不会‘相遇’。”不,这是不对的。发送方发送到接收方的端口。它们不必相同。
标签: java sockets multicast multicastsocket