public MessagePasser(String inConfigurationFilename, String inLocalName, boolean inUseLogicalClock)
			throws FileNotFoundException {
		this.configurationFileName = inConfigurationFilename;
		this.localName = inLocalName;
		this.useLogicalClock = inUseLogicalClock;
		this.state = RELEASED;
		this.voted = false;
		this.receivedAckNumber = 0;
		ConfigFileParser parser;
		parser = new ConfigFileParser(this.configurationFileName, this.localName);
		this.peerNodeList = parser.getPeerNodes();
		this.allNodeList = parser.getAllNodes();
		this.receiveRuleList = parser.getReceiveRules();
		this.sendRuleList = parser.getSendRules();
		this.loggerIp = parser.getLoggerIp();
		this.loggerPort = parser.getLoggerPort();
		this.localNodeIndex = parser.getLocalNodeIndex();
		this.localPort = parser.getLocalNode().getPort();
		this.localIp = parser.getLocalNode().getIp();
		this.groupMembers = parser.getGroupMembers();

		if (this.useLogicalClock) {
			clockService = new LogicalClock();
		} else {
			clockService = new VectorClock(allNodeList.size(), localNodeIndex);
			Iterator<String> iter = groupMembers.keySet().iterator();
			while (iter.hasNext()) {
				clockServiceGroups.put(iter.next(), new VectorClock(allNodeList.size(), localNodeIndex));
			}
		}
		try {
			this.listenerSocket = new ServerSocket(this.localPort);
			startListenerThread(); // setUp the initial connection
			startMessageReceiverThread(); // create receive
		} catch (IOException e) {
			e.printStackTrace();
		}
		printInfo();
	}