Uber cool Russell, Rickard you copy that?

marc


[EMAIL PROTECTED] wrote:
> 
> marc fleury wrote:
> > Then don't tease us and can you GPL-spare that "multicast socket" code?
> > the idea is that a "new born" JNP client should be able to find his
> > provider by crying on the network "where is my MOM"?.  AFAIK if the
> > naming is bootp'd then we are all set.
> 
> Ok, ok, here ya go!  Enjoy!  Basically, all I'm doing is creating
> an extremely simple Message class.  I serialize this and send it
> out the multicast socket.  Both client and server do this, so it
> doesn't matter which comes up first (the client resends its packet
> when it receives a broadcast from a server).
> 
> The server receives a broadcast message from a client and looks up
> the senders address in a config file.  If found, all my app needs
> to do is connect to the client via RMI.  Hope that isn't too
> confusing.  The "server" here is a monitor/controller and the
> "client" is the source of data, the RMI server.
> 
> public class Message implements Serializable
> {
>    public Message(String source, String content)
>    {
>       this.source = source;
>       this.content = content;
>    }
> 
>    public String content;
>    public String source;
> }
> 
> public interface BroadcastConstants
> {
>    static final String GROUP = "239.2.3.9";
>    static final int PORT = 3333;
>    static final int TTL = 1;
> }
> 
> public class BroadcastClient implements Runnable, BroadcastConstants
> {
>    public BroadcastClient()
>    {
>       try
>       {
>          group = InetAddress.getByName(GROUP);
> 
>          sock = new MulticastSocket(PORT);
>          sock.setTimeToLive(TTL);
>          sock.joinGroup(group);
> 
>          // set a receive timeout to periodically check for shutdown
>          sock.setSoTimeout(200);
>       }
>       catch ( Exception e )
>       {
>          e.printStackTrace();
>       }
>    }
> 
>    /**
>     *  Broadcast a packet announcing our presence
>     */
>    private void announce() throws IOException
>    {
>       Message pkg = new Message("client", announce);
> 
>       ByteArrayOutputStream baos = new ByteArrayOutputStream();
>       ObjectOutputStream oos = new ObjectOutputStream(baos);
>       oos.writeObject(pkg);
> 
>       byte[] msg = baos.toByteArray();
>       DatagramPacket pkt = new DatagramPacket(msg, msg.length, group, PORT);
>       sock.send(pkt);
>    }
> 
>    /**
>     *  Listen for server announcements
>     */
>    private void listen() throws IOException
>    {
>       byte[] recvBuffer = new byte[5000];
>       DatagramPacket recv = new DatagramPacket(recvBuffer, recvBuffer.length);
> 
>       try
>       {
>          sock.receive(recv);
>       }
>       catch ( InterruptedIOException ie )
>       {
>          return;
>       }
> 
>       byte[] buf = new byte[5000];
>       System.arraycopy(recvBuffer, 0, buf, 0, recv.getLength());
> 
>       try
>       {
>          ObjectInputStream ois = new ObjectInputStream( new
> ByteArrayInputStream(buf) );
>          Message msg = (Message) ois.readObject();
> 
>          // a server just came online -- resend my announcement
>          if ( msg.source.equals("server") )
>          {
>             announce();
>          }
>       }
>       catch (ClassNotFoundException cnf) { }
>    }
> 
>    public void run()
>    {
>       try
>       {
>          announce();
>       }
>       catch (IOException e)
>       {
>          e.printStackTrace();
>          return;
>       }
> 
>       while (! stopping)
>       {
>          try
>          {
>             listen();
>          }
>          catch (IOException ioe)
>          {
>             ioe.printStackTrace();
> 
>             if (sock.getPort() == -1)
>             {  // connection lost
>                System.exit(1);
>             }
>          }
>       }
>    }
> 
>    public void shutdown()
>    {
>       stopping = true;
>    }
> 
>    private boolean stopping = false;
> 
>    private InetAddress group;
>    private MulticastSocket sock;
> 
>    private static final String announce = "Client announce";
> }
> 
> public class BroadcastServer implements Runnable, BroadcastConstants
> {
>    public BroadcastServer(ServiceHandler handler)
>    {
>       try
>       {
>          group = InetAddress.getByName(GROUP);
> 
>          sock = new MulticastSocket(PORT);
>          sock.setTimeToLive(TTL);
>          sock.joinGroup(group);
>       }
>       catch (Exception e)
>       {
>          e.printStackTrace();
>          System.exit(1);
>       }
> 
>       this.handler = handler;
>    }
> 
>    public void run()
>    {
>       // first, send out an announcement that I'm here
>       // in case there are clients waiting
>       Message msg = new Message("server", announce);
> 
>       try
>       {
>          ByteArrayOutputStream baos = new ByteArrayOutputStream();
>          ObjectOutputStream oos = new ObjectOutputStream(baos);
>          oos.writeObject(msg);
>          oos.flush();
> 
>          byte[] msgData = baos.toByteArray();
>          DatagramPacket pkt = new DatagramPacket(msgData, msgData.length,
>                                                  group, PORT);
>          sock.send(pkt);
>       }
>       catch (Exception e)
>       {
>          e.printStackTrace();
>          System.exit(1);
>       }
> 
>       // now, wait for service requests from clients
>       byte[] recvBuffer = new byte[5000];
>       while ( true )
>       {
>          try
>          {
>             DatagramPacket recv = new DatagramPacket(recvBuffer,
> recvBuffer.length);
>             sock.receive(recv);
> 
>             InetAddress recvAddr = recv.getAddress();
> 
>             byte[] buf = new byte[5000];
>             System.arraycopy(recvBuffer, 0, buf, 0, recv.getLength());
> 
>             ObjectInputStream ois = new ObjectInputStream( new
> ByteArrayInputStream(buf) );
>             Message m = (Message) ois.readObject();
> 
>             if ( m.source.equals("client") )
>             {
>                handler.service(recvAddr.getHostName());
>             }
>          }
>          catch ( Exception e )
>          {
>             e.printStackTrace();
>          }
>       }
>    }
> 
>    private ServiceHandler handler;
> 
>    private static InetAddress group;
>    private static MulticastSocket sock;
> 
>    private static final String announce = "Server announce";
> }
> 
> public interface ServiceHandler
> {
>    /**
>     *  Service an announcement from a client at address
>     */
>    public void service(String address);
> }
> 
> --
> --------------------------------------------------------------
> To subscribe:        [EMAIL PROTECTED]
> To unsubscribe:      [EMAIL PROTECTED]
> Problems?:           [EMAIL PROTECTED]


--
--------------------------------------------------------------
To subscribe:        [EMAIL PROTECTED]
To unsubscribe:      [EMAIL PROTECTED]
Problems?:           [EMAIL PROTECTED]

Reply via email to