In this example we are going to explain how to use
MulticastSocket in Java, in order to enable a server to easily send information to
multiple clients, which are all connected to the same port and address. We will describe the whole process, by creating
both the server and the client, and guide you through the main concepts that need to be understood to create this type of applications.
1. MulticastSocket Server
We are going to use a
DatagramSocket, to enable the server to send packets of information to the client/clients. A datagram, by definition, is
“an independent, self-contained message sent over the network whose arrival, arrival time, and content are not guaranteed”. Essentially, we are opening a
DatagramSocket in order to send
DatagramPacket
messages to the client. We are using the datagram classes (instead of
standard sockets) because they allow us to broadcast information to
multiple clients, that are all connected to a
MulticastSocket.
Let’s see the code of the server:
MulticastSocketServer.java
01 | import java.io.IOException; |
02 | import java.net.DatagramPacket; |
03 | import java.net.DatagramSocket; |
04 | import java.net.InetAddress; |
05 | import java.net.UnknownHostException; |
07 | public class MulticastSocketServer { |
09 | final static String INET_ADDR = "224.0.0.3"; |
10 | final static int PORT = 8888; |
12 | public static void main(String[] args) throws UnknownHostException, InterruptedException { |
14 | InetAddress addr = InetAddress.getByName(INET_ADDR); |
17 | try (DatagramSocket serverSocket = new DatagramSocket()) { |
18 | for (int i = 0; i < 5; i++) { |
19 | String msg = "Sent message no " + i; |
23 | DatagramPacket msgPacket = new DatagramPacket(msg.getBytes(), |
24 | msg.getBytes().length, addr, PORT); |
25 | serverSocket.send(msgPacket); |
27 | System.out.println("Server sent packet with msg: " + msg); |
30 | } catch (IOException ex) { |
One thing that we need to take into consideration here, is that there are specific addresses that allow us to use a
MulticastSocket are limited, specifically in the range of
224.0.0.0 to 239.255.255.255. Some of them are reserved, like 224.0.0.0. The address that we are using, 224.0.0.3, can be used safely.
2. MulticastSocket Client
Regarding
the client, we are going to move a little bit differently. We are going
to create a client class, that will accept incoming messages from the
server, and then we are going to duplicate this class. The point here is
that by using the same code, we can connect to the server seamlessly,
while having as many clients as we like.
Let’s see the code of the client:
MulticastSocketClient.java
01 | import java.io.IOException; |
02 | import java.net.DatagramPacket; |
03 | import java.net.InetAddress; |
04 | import java.net.MulticastSocket; |
05 | import java.net.UnknownHostException; |
07 | public class MulticastSocketClient { |
09 | final static String INET_ADDR = "224.0.0.3"; |
10 | final static int PORT = 8888; |
12 | public static void main(String[] args) throws UnknownHostException { |
14 | InetAddress address = InetAddress.getByName(INET_ADDR); |
19 | byte[] buf = new byte[256]; |
23 | try (MulticastSocket clientSocket = new MulticastSocket(PORT)){ |
25 | clientSocket.joinGroup(address); |
29 | DatagramPacket msgPacket = new DatagramPacket(buf, buf.length); |
30 | clientSocket.receive(msgPacket); |
32 | String msg = new String(buf, 0, buf.length); |
33 | System.out.println("Socket 1 received msg: " + msg); |
35 | } catch (IOException ex) { |
First,
we start the client, which will keep waiting for incoming packets of
information. As soon as we start the server, it will send the
information packets and the client will receive them and print the
information on the screen.
Server Output
1 | Server sent packet with msg: Sent message no 0 |
2 | Server sent packet with msg: Sent message no 1 |
3 | Server sent packet with msg: Sent message no 2 |
4 | Server sent packet with msg: Sent message no 3 |
5 | Server sent packet with msg: Sent message no 4 |
Client Output
1 | Socket 1 received msg: Sent message no 0 |
2 | Socket 1 received msg: Sent message no 1 |
3 | Socket 1 received msg: Sent message no 2 |
4 | Socket 1 received msg: Sent message no 3 |
5 | Socket 1 received msg: Sent message no 4 |
In order to use multiple clients, just create anew Java project and copy-paste the code of the client, but change the output to
Socket 2 instead of
Socket 1.
You will see that when the server runs, the messages will be sent to
both clients, and both clients will print the same results (except for
the socket number part). Take a look at this screenshot here. We are
running the first client through eclipse, the second through the command
line, and the server through the command line as well.