Address already in use - Multicast Socket

0

Probuje napisac kod serwera ktory wyslalaby do swojej grupy informacje o aktualnej dacie i klienta ktory by ja odbieral. Kod:
SERWER

public class TimeServer {

   public static void main(String[] args) {
      try {
         final DatagramSocket so = new DatagramSocket(8189);
         new Thread(new Runnable() {
            @Override
            public void run() {
               try {
                  while (true) {
                     try {
                        InetAddress group = InetAddress.getByName("200.20.2.0");
                        byte[] buf = new byte[256];
                        Calendar cal = Calendar.getInstance();
                        buf = cal.toString().getBytes();
                        DatagramPacket packet = new DatagramPacket(buf, buf.length,
                                group, 8189);
                        so.send(packet);
                     } catch (IOException ex) {
                        ex.printStackTrace();
                     }
                     Thread.sleep((int)(Math.random() * 5));
                  }
               } catch (InterruptedException ex) {
                  ex.printStackTrace();
               }
            }
         }).start();
      } catch (IOException ex) {
         ex.printStackTrace();
      }
   }
}

KLIENT

public class TimeClient {

   public static void main(String[] args) {
      try {
         MulticastSocket so = new MulticastSocket(8189);
         InetAddress group = InetAddress.getByName("200.20.2.0");
         so.joinGroup(group);
         
         //5 razy czekamy na otrzymanie od serwera wiadomosci
         for (int a=0; a<5; a++) {
            byte[] buf = new byte[256];
            DatagramPacket packet = new DatagramPacket(buf, buf.length);
            so.receive(packet);
            
            String recv = new String(packet.getData());
            System.out.println("RECEIVED: " + recv);
         }
         
         so.leaveGroup(group);
         so.close();
      } catch (IOException ex) {
         ex.printStackTrace();
      } 
   }

}

Po uruchomieniu serwera, a nastepnie klienta dostaje wyjatek:

java.net.BindException: Address already in use
	at java.net.PlainDatagramSocketImpl.bind0(Native Method)
	at java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:95)
	at java.net.DatagramSocket.bind(DatagramSocket.java:376)
	at java.net.MulticastSocket.<init>(MulticastSocket.java:172)
	at java.net.MulticastSocket.<init>(MulticastSocket.java:137)
	at timeclient.TimeClient.main(TimeClient.java:13)

Co jest nie tak?

0

Nie możesz bindować wielu socketów na tym samym porcie, a to właśnie robisz. Bindujesz serwer na 8189 i klienta tez tam chcesz bindować.

0

Możesz też wysyłać na adres multicastowy poprzez zwykły DatagramSocket, wtedy wszyscy klienci w podsieci otrzymają pakiet.

1 użytkowników online, w tym zalogowanych: 0, gości: 1