我开发客户端-服务器应用程序,实时工作。服务器和客户端通过小消息进行交换,因此我为我的架构选择了 UDP(正如网络中许多文章中所建议的那样)。使用默认的 java 的 DatagramSocket/DatagramPacket 来组织我想要的所有东西对我来说不是问题,但是当我阅读文档时,我看到了“MulticastSocket”的机会。但对我来说完全不清楚:用户端的 MutlicastSocket 将如何知道在哪里连接?(服务器的公共 IP/端口)。真的,正如官方 java教程中所示。MulticastSocket 创建如下:
MulticastSocket socket = new MulticastSocket(4446);
InetAddress group = InetAddress.getByName("203.0.113.0");
socket.joinGroup(group);
并且没有任何关于公共服务器 IP 和端口的规范。什么是“203.0.113.0”?应用程序的音调可能会向网络中的该地址发送一些东西,不是吗?
当我以常规(不是多播)方式创建客户端时,我使用如下内容:
DatagramSocket outputClientSocket = new DatagramSocket();
DatagramPacket outputPacket = new DatagramPacket(new byte[512],512,InetAddress.getByName("94.***.89.***"),9898);
...
其中“94.???.89.???” 是我服务器的公共 IP 地址,而 9898 是我服务器的端口,它会监听它。像那样:
DatagramSocket serverInputSocket = new DatagramSocket(9898);
DatagramPacket inputServerPacket = new DatagramPacket(new byte[512],512);
serverInputSocket.recieve(inputServerPacket);
在收到一些东西后,我可以与客户建立联系,并为他回答一些问题,比如:
DatagramSocket socketForSpecificClient = new DatagramSocket();
InetAddress realClientAddress = inputServerPacket.getAddress();
int realClientPort = inputServerPacket.getPort();
DatagramPacket packetForSpecificClient = new DatagramPacket(new byte[512],512,realClientAddress,realClientPort);
socketForSpecificClient.send(packetForSpecificClient);
即使客户端没有公共 IP,这种方法也很有效。这是为我建立连接的绝对清晰的方式,但我不明白 MulticastSocket 应该用于什么目的?