/**
  * Watches an event.
  *
  * @param name event name
  * @param notifier event notification
  * @throws IOException I/O exception
  */
 public void watch(final String name, final EventNotifier notifier) throws IOException {
   out.write(10);
   if (esocket == null) {
     final int eport = Integer.parseInt(receive());
     // initialize event socket
     esocket = new Socket();
     esocket.connect(new InetSocketAddress(ehost, eport), 5000);
     final OutputStream os = esocket.getOutputStream();
     receive(in, os);
     os.write(0);
     os.flush();
     final InputStream is = esocket.getInputStream();
     is.read();
     listen(is);
   }
   send(name);
   info = receive();
   if (!ok()) throw new IOException(info);
   notifiers.put(name, notifier);
 }
 /**
  * Receives a string and writes it to the specified output stream.
  *
  * @param is input stream
  * @param os output stream
  * @throws IOException I/O exception
  */
 static void receive(final InputStream is, final OutputStream os) throws IOException {
   for (int b; (b = is.read()) > 0; ) {
     // read next byte if 0xFF is received
     os.write(b == 0xFF ? is.read() : b);
   }
 }