www.pudn.com > jnp-src.rar > Demultiplexer.java


/*
 * Java Network Programming, Second Edition
 * Merlin Hughes, Michael Shoffner, Derek Hamner
 * Manning Publications Company; ISBN 188477749X
 *
 * http://nitric.com/jnp/
 *
 * Copyright (c) 1997-1999 Merlin Hughes, Michael Shoffner, Derek Hamner;
 * all rights reserved; see license.txt for details.
 */

import java.io.*; 
import java.util.*; 
 
public class Demultiplexer extends Thread { 
  static private int plexerNumber; 
  static private synchronized int nextPlexerNum () { return plexerNumber ++; } 
 
  protected MultiplexInputStream multiplexIn; 
  protected Hashtable targets; 
 
  public Demultiplexer (MessageInput messageIn) { 
    super ("Demultiplexer-" + nextPlexerNum ()); 
    multiplexIn = new MultiplexInputStream (messageIn); 
    targets = new Hashtable (); 
  } 
 
  public void register (String label, MessageOutput messageOut) { 
    targets.put (label, messageOut); 
  } 
 
  public void deregister (String label) { 
    targets.remove (label); 
  } 
 
  protected boolean finished; 
   
  public void finish () { 
    finished = true; 
    interrupt (); 
  } 
 
  public void run () { 
    try { 
      while (!interrupted ()) { 
        multiplexIn.receive (); 
        String label = multiplexIn.getLabel (); 
        MessageOutput messageOut = (MessageOutput) targets.get (label); 
        if (messageOut != null) { 
          byte[] message = new byte[multiplexIn.available ()]; 
          multiplexIn.readFully (message); 
          synchronized (messageOut) { 
            messageOut.write (message); 
            messageOut.send (); 
          } 
        } 
      } 
    } catch (IOException ex) { 
      if (!finished) 
        ex.printStackTrace (); 
    } 
  } 
}