Hey hey hey

marc fleury wrote:
> 
> Uber cool Russell, Rickard you copy that?

Yeah, only I already had this in the .cluster package that I had created
for testing. Although I also included a heartbeat to make sure that the
server was up. If someone Ctrl-C's the server there's no "I'm going down
now" message sent, so the other nodes had to use a heartbeat timeout to
detect it. 

Although this is a bit redundant since I, now, realize that this is just
the sort of thing Jini does for you. And in a much better way.

:-)

/Rickard

> 
> 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]

-- 
Rickard �berg

@home: +46 13 177937
Email: [EMAIL PROTECTED]
http://www.telkel.com
http://www.ejboss.org
http://www.dreambean.com


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

Reply via email to