⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 quickserver.java

📁 一个用java编写的服务器,对于学习网络编程的人来说是个很好的例子
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
		serviceError = null;
		if(getServiceState() == Service.RUNNING)
			return false;
		try	{
			startServer();
		} catch(AppException e) {
			serviceError = e;
			return false;
		}
		return true;
	}

	/**
	 * Stop the service.
	 * @return true if serivce was stopped from Running state.
	 * @since 1.2
	 */
	public boolean stopService() {
		serviceError = null;
		if(getServiceState() == Service.STOPPED)
			return false;
		try	{
			stopServer();
			clearAllPools();
		} catch(AppException e) {
			serviceError = e;
			return false;
		} catch(Exception e) {
			serviceError = e;
			return false;
		}
		return true;
	}

	/**
	 * Suspends the service.
	 * @return true if service was suspended from resumed state.
	 * @since 1.2
	 */
	public boolean suspendService() {
		serviceError = null;
		if(getServiceState() == Service.RUNNING) {
			suspendMaxConnection = maxConnection;
			suspendMaxConnectionMsg = maxConnectionMsg;
			maxConnection = 0;
			maxConnectionMsg = "Service is suspended.";
			setServiceState(Service.SUSPENDED);
			logger.info("Service "+getName()+" is suspended.");
			return true;
		}
		return false;
	}
	/**
	 * Resume the service.
	 * @return true if service was resumed from suspended state.
	 * @since 1.2
	 */ 
	public boolean resumeService() {
		serviceError = null;
		if(getServiceState() == Service.SUSPENDED) {
			maxConnection = suspendMaxConnection;
			maxConnectionMsg = suspendMaxConnectionMsg;
			setServiceState(Service.RUNNING);
			logger.info("Service "+getName()+" resumed.");
			return true;
		}
		return false;
	}
	/** 
	 * Information about the service.
	 * @since 1.2
	 */
	public String info() {
		serviceError = null;
		StringBuffer buf = new StringBuffer();
		buf.append(getName()+"\n");
		buf.append(getBindAddr().getHostAddress()+" "+getPort()+"\n");
		return buf.toString();
	}
	// *** End of Service interface methods

	/**
	 * Initialise and create the server.
	 * @param param of the xml configuration file.
	 * @exception AppException if QuickServerConfig creation failed from the xml config file.
	 * @since 1.4.7
	 */
	public synchronized void initServer(Object param[]) throws AppException {
		QuickServerConfig qsConfig = null;
		try {
			qsConfig = ConfigReader.read( (String)param[0]);
		} catch(Exception e) {
			logger.severe("Could not init server from xml file "+
				(new File((String)param[0]).getAbsolutePath())+" : " +e);
			throw new AppException("Could not init server from xml file",e);
		}
		initServer(qsConfig);
	}

	/**
	 * Initialise and create the service.
	 * @param qsConfig QuickServerConfig object.
	 * @since 1.4.7
	 */
	public synchronized void initServer(QuickServerConfig qsConfig) throws AppException {
		setConfig(qsConfig);
		try {
			configQuickServer();

			loadApplicationClasses();

			//start InitServerHooks
			InitServerHooks ish = getConfig().getInitServerHooks();
			if(ish!=null) {
				Iterator iterator = ish.iterator();
				String initServerHookClassName = null;
				Class initServerHookClass = null;
				InitServerHook initServerHook = null;
				while(iterator.hasNext()) {
					initServerHookClassName = (String)iterator.next();
					initServerHookClass = getClass(initServerHookClassName, true);
					initServerHook = (InitServerHook) initServerHookClass.newInstance();

					logger.info("Loaded init server hook: " + initServerHookClassName);
					logger.fine("Init server hook info: " + initServerHook.info());
					initServerHook.handleInit(QuickServer.this);
				}
			}
		} catch(Exception e) {
			logger.severe("Could not load init server hook: " +e);
			logger.warning("StackTrace:\n"+MyString.getStackTrace(e));
			throw new AppException("Could not load init server hook",e);
		}
		setServiceState(Service.INIT);
		logger.finest("\r\n"+MyString.getSystemInfo(getVersion()));
	}

	/** 
	 * Returns the state of the process 
	 * As any constant of {@link Service} interface.
	 * @since 1.2
	 */
	public int getServiceState() {
		return serviceState;
	}
	/** 
	 * Sets the state of the process 
	 * As any constant of {@link Service} interface.
	 * @since 1.2
	 */
	public void setServiceState(int state) {
		serviceState = state;
	}

	private void configConsoleLoggingLevel(QuickServer qs, String temp) {
		if(temp.equals("SEVERE"))
			qs.setConsoleLoggingLevel(Level.SEVERE);
		else if(temp.equals("WARNING"))
			qs.setConsoleLoggingLevel(Level.WARNING);
		else if(temp.equals("INFO"))
			qs.setConsoleLoggingLevel(Level.INFO);
		else if(temp.equals("CONFIG"))
			qs.setConsoleLoggingLevel(Level.CONFIG);
		else if(temp.equals("FINE"))
			qs.setConsoleLoggingLevel(Level.FINE);
		else if(temp.equals("FINER"))
			qs.setConsoleLoggingLevel(Level.FINER);
		else if(temp.equals("FINEST"))
			qs.setConsoleLoggingLevel(Level.FINEST);
		else 
			logger.warning("unknown level "+temp);
	}
	
	/**
	 * Configures QuickServer based on the passed QuickServerConfig object.
	 * @since 1.2
	 */
	public void configQuickServer(QuickServerConfig config) throws Exception {
		QuickServer qs = QuickServer.this;
		qs.setConfig(config); //v1.3
		qs.setBasicConfig(config);
		String temp = config.getConsoleLoggingLevel();
		configConsoleLoggingLevel(qs, temp);
		temp = null;
		
		qs.setConsoleLoggingFormatter(config.getConsoleLoggingFormatter());

		qs.setName(config.getName());
		qs.setPort(config.getPort());
		qs.setClientEventHandler(config.getClientEventHandler());
		qs.setClientCommandHandler(config.getClientCommandHandler());
		if(config.getAuthenticator()!=null)
			qs.setAuthenticator(config.getAuthenticator()); //v1.3
		else if(config.getClientAuthenticationHandler()!=null)
			qs.setClientAuthenticationHandler(config.getClientAuthenticationHandler()); //v1.4.6
		qs.setClientObjectHandler(config.getClientObjectHandler());
		qs.setClientBinaryHandler(config.getClientBinaryHandler());//v1.4
		qs.setClientWriteHandler(config.getClientWriteHandler());//v1.4.5
		qs.setClientData(config.getClientData());
		qs.setClientExtendedEventHandler(config.getClientExtendedEventHandler());
		qs.setDefaultDataMode(config.getDefaultDataMode());//v1.4.6
		qs.setServerBanner(config.getServerBanner());
		qs.setTimeout(config.getTimeout());
		qs.setMaxAuthTry(config.getMaxAuthTry());
		qs.setMaxAuthTryMsg(config.getMaxAuthTryMsg());
		qs.setTimeoutMsg(config.getTimeoutMsg());
		qs.setMaxConnection(config.getMaxConnection());
		qs.setMaxConnectionMsg(config.getMaxConnectionMsg());
		qs.setBindAddr(config.getBindAddr());
		//v1.3.2
		qs.setCommunicationLogging(config.getCommunicationLogging());
		//v1.3.3
		qs.setSecurityManagerClass(config.getSecurityManagerClass());
		qs.setAccessConstraintConfig(config.getAccessConstraintConfig());
		temp = config.getApplicationJarPath();
		if(temp!=null) {
			File ajp = new File(temp);
			if(ajp.isAbsolute()==false) {
				temp = config.getConfigFile();
				ajp = new File(temp);
				temp = ajp.getParent() + File.separatorChar + 
					config.getApplicationJarPath();
				config.setApplicationJarPath(temp);
				temp = null;
			}
			qs.setApplicationJarPath(config.getApplicationJarPath());
			//set path also to QSAdmin
			if(config.getQSAdminServerConfig() != null ) {
				getQSAdminServer().getServer().setApplicationJarPath(
					config.getApplicationJarPath());
			}
		}
		qs.setServerHooks(config.getServerHooks());
		qs.setSecure(config.getSecure());
	}

	/**
	 * Configures QSAdminServer based on the passed QuickServerConfig object.
	 * @since 1.2
	 */
	public void configQuickServer(QSAdminServerConfig config) 
			throws Exception {
		QuickServer qs = getQSAdminServer().getServer();
		qs.setBasicConfig(config);
		
		//set the Logging Level to same as main QS
		String temp = getConsoleLoggingLevel();//config.getConsoleLoggingLevel();
		configConsoleLoggingLevel(qs, temp);
		
		//set the Logging Formatter to same as main QS
		//qs.setConsoleLoggingFormatter(config.getConsoleLoggingFormatter());
		qs.setConsoleLoggingFormatter(getConsoleLoggingFormatter());
		
		qs.setClientEventHandler(config.getClientEventHandler());//v1.4.6
		qs.setClientCommandHandler(config.getClientCommandHandler());
		qs.setName(config.getName());
		qs.setPort(config.getPort());
		if(config.getAuthenticator()!=null)
			qs.setAuthenticator(config.getAuthenticator()); //v1.3
		else  if(config.getClientAuthenticationHandler()!=null)
			qs.setClientAuthenticationHandler(config.getClientAuthenticationHandler()); //v1.4.6
		qs.setClientObjectHandler(config.getClientObjectHandler());
		qs.setClientBinaryHandler(config.getClientBinaryHandler());//v1.4
		qs.setClientWriteHandler(config.getClientWriteHandler());//v1.4.5
		qs.setClientData(config.getClientData());
		qs.setClientExtendedEventHandler(config.getClientExtendedEventHandler());//v1.4.6
		qs.setDefaultDataMode(config.getDefaultDataMode());//v1.4.6
		qs.setServerBanner(config.getServerBanner());
		qs.setTimeout(config.getTimeout());
		qs.setMaxAuthTry(config.getMaxAuthTry());
		qs.setMaxAuthTryMsg(config.getMaxAuthTryMsg());
		qs.setTimeoutMsg(config.getTimeoutMsg());
		qs.setMaxConnection(config.getMaxConnection());
		qs.setMaxConnectionMsg(config.getMaxConnectionMsg());
		qs.setBindAddr(config.getBindAddr());
		//v1.3.2
		qs.setCommunicationLogging(config.getCommunicationLogging());
		getQSAdminServer().setCommandPlugin(config.getCommandPlugin());
		//v1.3.2
		if(config.getCommandShellEnable().equals("true"))
			getQSAdminServer().setShellEnable(true);
		getQSAdminServer().setPromptName(config.getCommandShellPromptName());
		//v1.3.3
		qs.setAccessConstraintConfig(config.getAccessConstraintConfig());
		qs.setServerHooks(config.getServerHooks());
		qs.setSecure(config.getSecure());
	}

	/**
	 * Configures QSAdminServer and QuickServer based on the 
	 * internal QuickServerConfig object.
	 * @since 1.3
	 */
	public void configQuickServer() throws Exception {
		configQuickServer(getConfig());
		if(getConfig().getQSAdminServerConfig() != null ) {
			configQuickServer(getConfig().getQSAdminServerConfig());
		}
	}

	/**
	 * Usage: QuickServer [-options]<br/>
	 * Where options include:<br/>
	 *   -about		Opens About Dialogbox<br/>
	 *   -load <xml_config_file> [options]	Loads the server from xml file.
	 * where options include:
	 *    -fullXML2File <new_file_name>
	 */
	public static void main(String args[]) {
		try {
			if(args.length >= 1) {
				if(args[0].equals("-about")) {
					org.quickserver.net.server.gui.About.main(null);
				} else if(args[0].equals("-load") && args.length>=2) {
					QuickServer qs = QuickServer.load(args[1]);
					if(qs!=null) handleOptions(args, qs);
				} else {
					System.out.println(printUsage());
				}
			} else {
				System.out.println(printUsage());
				org.quickserver.net.server.gui.About.showAbout();
			}
		} catch(Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Loads the server from the xml file name passed.
	 * @since 1.4.7
	 */
	public static QuickServer load(String xml) throws AppException {
		QuickServer qs = new QuickServer();
		Object config[] = new Object[] {xml};
		qs.initServer(config);
		qs.startServer();
		if(qs.getConfig().getQSAdminServerConfig()!= null) {
			qs.startQSAdminServer();
		}
		return qs;
	}
	
	/** Prints usage */
	private static String printUsage() {
		StringBuffer sb = new StringBuffer();
		sb.append("QuickServer - Java library/framework for creating robust multi-client TCP servers.\n");
		sb.append("Copyright (C) QuickServer.org\n\n");
		sb.append("Usage: QuickServer [-options]\n");
		sb.append("Where options include:\n");
		sb.append("  -about\t"+"Opens About Dialog box\n");
		sb.append("  -load <xml_config_file> [load-options]\t"+"Loads the server from xml file.\n");
		sb.append("  Where load-options include:\n");
		sb.append("     -fullXML2File <file_name>\t"+"Dumps the Full XML configuration of the QuickServer loaded.\n");
		return sb.toString();
	}

	private static void handleOptions(String args[], QuickServer quickserver) {
		if(args.length<3) return;

		if(args[2].equals("-fullXML2File") && args.length>=4) {
			File file = new File(args[3]);
			logger.info("Writing full xml configuration to file: "+file.getAbsolutePath());
			try {
				TextFile.write(file, quickserver.getConfig().toXML(null));	
			} catch(Exception e) {
				logger.warning("Error writing full xml configuration: "+e);
			}			
		}
	}

	/**
	 * Cleans all Object and Thread pools
	 * @since 1.3
	 */
	public void clearAllPools() throws Exception {
		try {
			if(pool!=null)
				getClientPool().clear();
			if(clientHandlerPool!=null)
				getClientHandlerPool().clear();
			if(getClientDataPool()!=null)
				getClientDataPool().clear();
			if(getDBPoolUtil()!=null)
				getDBPoolUtil().clean();
			if(byteBufferPool!=null)
				getByteBufferPool().clear();
		} catch(Exception e) {
			logger.warning("Error: "+e);
			throw e;
		}
	}

	/**
	 * Closes all Object and Thread pools
	 * @since 1.3
	 */
	public void closeAllPools() throws Exception {
		if(pool==null && clientHandlerPool==null && getClientDataPool()==null &&
				getDBPoolUtil()==null && byteBufferPool==null) {
			return;
		}
		logger.fine("Closing pools for "+getName());
		try {
			if(pool!=null && PoolHelper.isPoolOpen(getClientPool().getObjectPool())) {
				logger.finer("Closing ClientThread pool.");
				getClientPool().close();
			}
			if(clientHandlerPool!=null && PoolHelper.isPoolOpen(getClientHandlerPool())) {
				logger.finer("Closing ClientHandler pool.");
				getClientHandlerPool().close();
			}
			if(getClientDataPool()!=null && PoolHelper.isPoolOpen(getClientDataPool())) {
				logger.finer("Closing ClientData pool.");
				getClientDataPool().close();
			}
			if(getDBPoolUtil()!=null) {
				logger.finer("Closing DB pool.");
				getDBPoolUtil().clean();
			}
			if(byteBufferPool!=null && PoolHelper.isPoolOpen(getByteBufferPool())) {
				logger.finer("Closing ByteBuffer pool.");
				getByteBufferPool().close();
			}
			logger.fine("Closed pools for "+getName());
		} catch(Exception e) {
			logger.warning("Error closing pools for "+getName()+": "+e);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -