/** listen and respond */ protected void listenFn() { try { System.out.println( "Listening on equipd://" + InetAddress.getLocalHost().getHostAddress() + ":" + socket.getLocalPort()); while (true) { byte announceData[] = new byte[1024]; DatagramPacket announcepkt = new DatagramPacket(announceData, announceData.length); try { // get a packet socket.receive(announcepkt); } catch (Exception e) { System.err.println("ERROR: in DiscoveryRendezvoud receive: " + e + " (give up!)"); return; } try { ByteArrayInputStream bins = new ByteArrayInputStream(announcepkt.getData(), 0, announcepkt.getLength()); equip.runtime.ObjectInputStream oins = new equip.runtime.ObjectInputStream(bins); long version = oins.readInt(); if (version != DISCOVERY_VERSION.value) { System.err.println( "Warning: DiscoveryRendezvous failed to " + "get a valid discovery object " + "from " + announcepkt.getAddress() + "/" + announcepkt.getPort() + " (" + announcepkt.getLength() + " bytes), " + "version " + version + " (expecting " + DISCOVERY_VERSION.value + ")"); continue; } Object msg = oins.readObject(); System.out.println("Received a " + msg.getClass().getName()); ServerAnnouncementImpl announcement = null; DiscoveryRequestImpl request = null; if (msg instanceof ServerAnnouncementImpl) { announcement = (ServerAnnouncementImpl) msg; } else if (msg instanceof DiscoveryRequestImpl) { request = (DiscoveryRequestImpl) msg; } else // don't know what to do with this! { continue; } synchronized (peers) { boolean found = false; Iterator ipeer = peers.iterator(); PeerInfo peer = null; while (ipeer.hasNext() && !found) { peer = (PeerInfo) ipeer.next(); if (peer.address.equals(announcepkt.getAddress()) && peer.port == announcepkt.getPort()) { found = true; } } if (!found) { // new peer = new PeerInfo( announcepkt.getAddress(), announcepkt.getPort(), request, announcement); peers.addElement(peer); System.out.println("New " + (request != null ? "client" : "server")); // could do immediate response // .... } else { peer.lastReceiveTime = System.currentTimeMillis(); System.out.println("known"); if (announcement != null) { peer.announcement = announcement; } if (request != null) { peer.request = request; } } if (announcement != null) { // send announcement to all matching requests ipeer = peers.iterator(); while (ipeer.hasNext()) { peer = (PeerInfo) ipeer.next(); if (peer.request == null) { continue; } boolean matches = false; int si; for (si = 0; !matches && announcement.infos != null && si < announcement.infos.length; si++) { // match? if (DiscoveryServerAgentImpl.matchServiceTypes( peer.request.serviceTypes, announcement.infos[si].serviceTypes) && DiscoveryServerAgentImpl.matchServiceTypes( peer.request.groups, announcement.infos[si].groups)) { matches = true; } } // send! try { // return to specific address and port - hopefully better for NAT DatagramPacket p = new DatagramPacket( announcepkt.getData(), announcepkt.getLength(), peer.address, ((int) peer.port) & 0xffff); // adjust for overflow error - ianm socket.send(p); } catch (Exception e) { System.err.println( "ERROR forwarding announcement to " + peer.address + "/" + peer.port + ": " + e); } } } } } catch (Exception e) { System.err.println( "Warning: DiscoveryRendezvous failed to " + "get a valid discovery object " + "from " + announcepkt.getAddress() + "/" + announcepkt.getPort() + " (" + announcepkt.getLength() + " bytes)"); continue; } } } catch (Exception e) { System.err.println("ERROR in listenFn: " + e); e.printStackTrace(System.err); } }