public  void messageReceived(OSCMessage message, SocketAddress socketAddr, long time){
    // this gets called when a client sends us a message

    int port;
    String address;
    InetSocketAddress iSaddr;
    ConductorMessager messenger;
    String messageName;
    Improviser improviser; 
    int argCount;

    try {
      messageName = message.getName();
      argCount = message.getArgCount();
      // need to work out what the hostname is
      iSaddr = (InetSocketAddress)socketAddr;
      address = iSaddr.getHostName();
      System.out.println("Conductor - '"+message.getName()+"' message received from host "+address);
      // we need at least one arg as the first arg is always the port
      // number on which the client is listening, which allows us to
      // identify which client it is
      if (argCount > 0) {
	port = ((Number) message.getArg( 0 )).intValue();
	// - is it a 'hello port' message?
	if (messageName.contains ("hello")) {
	  addImproviser(address, port);
	}
	else {
	  // see if we know about this message
	  messenger = messengers.get(messageName);
	  if (messenger!=null) {
	    // we know this message
	    improviser = getImproviser(address, port);
	    //if (improviser!=null && improviser.canSendMessages()) {
	    if (improviser!=null && improviser.canSendMessage(messageName)) {
	      // we have an improviser registered for this message
	      // and they have not been blocked (e.g. by sending too many messages...)
	      // - update the count (arg count -1 as the first arg is their port no.)
	      improviser.addToMessageCounts(messageName, argCount -1);
	      messenger.setMessageData(oscArgsToObjects(message));
	    }
	  }  
	}
      }
    } catch (Exception e) {
      // this probably means there was something wrong with the
      // message, so we just avoid the puke and do nothing
      e.printStackTrace();
    }
  }