Создание своего Java Socket Server. Создание заготовки. Код в студию!

Написание сервера работа довольно объемная, поэтому описание функций я планирую делать методом добавления новой функциональности в демо-версию сервера.

Начнем с небольшой заготовки, которая будет содержать:

  • логгер
  • считывание параметров
public class JavaServer extends BaseJavaServerLoggedClass {

	public static JavaServerProperties properties;

	public static void main(String[] args) {
		prepare();
		info("String server...");
	}

	private static void prepare() {
		try {
			loadProperties();
			initLogger();
		} catch (Exception e) {
			System.out.println(e.getMessage());
			System.exit(-1);
		}
	}

	private static void loadProperties() throws Exception {
		properties = new JavaServerProperties();
		properties.loadProperties();
	}

	private static void initLogger() {
		org.apache.log4j.PropertyConfigurator.configure(properties.getProperty("log4j.propertyFileName"));
	}
}

Тут все предельно просто:
1. в методе initLogger() мы инициализируем логгер. Сами методы логера спрятаны в классе BaseJavaServerLoggedClass, чтобы не отвлекать от основного

public class BaseJavaServerLoggedClass {

	protected static final Logger logger = Logger.getLogger(JavaServer.class);

	protected static void info(String msg) {
		if (logger != null) {
			logger.info(msg);
		}
	}

	protected static void exception(String msg, Throwable t) {
		if (logger != null) {
			String message = "\n:::::::::::::::::::::::::::::::::::::::::::::::::::\n" + msg;
			logger.error(message, t);
		}
	}
}

2. в методе loadProperties() мы загружаем настройки сервера из файла config.xml при помощи класса JavaServerProperties. В дальнейшем мы будем считывать оттуда различные параметры сервера:

public class JavaServerProperties {

	private Properties properties;

	public void loadProperties() throws Exception {
		properties = readPropertiesFromFile();
	}

	public Properties readPropertiesFromFile() throws Exception {
		Properties properties = new Properties();
		FileInputStream fis = new FileInputStream("./config/config.xml");
		properties.loadFromXML(fis);
		return properties;
	}

	public String getProperty(String key) {
		return properties.getProperty(key);
	}

	public boolean getBoolen(String key) {
		String property = getProperty(key);
		return property.equals("true");
	}

	public int getInt(String key) {
		return Integer.parseInt(getProperty(key));
	}

	public long getLong(String key) {
		return Long.parseLong(getProperty(key));
	}

	public float getFloat(String key) {
		return Float.parseFloat(getProperty(key));
	}
}

В config.xml, к примеру считываем расположения файла настроек логгера в BaseJavaServerLoggedClass.initLogger():

properties.getProperty("log4j.propertyFileName")

config.xml выглядит примерно так:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
        <comment>Demo Java Soket Server Configuration</comment>
        
        <!--General Configuration-->
        <entry key="general.isDebugMode">true</entry>
        <entry key="log4j.propertyFileName">./config/log4j.properties</entry>

        <!--Server-->
        <entry key="server.port">9777</entry>
        <entry key="server.policyPort">9778</entry>
        <entry key="server.statPort">8083</entry>

</properties>

Настройки log4j.properties можно найти в документации в этой библиотеке.

Теперь, написав этот нехитрый код и запустив его, мы подготовили заготовку для нашего сервера.
В результате работы этого кода будет создана папка logs с файлом лога и записью типа

02 сен 2011 22:59:18,070 INFO  [main] demo.server.JavaServer     - String server...

И после приложение завершит свою работу.
На самом деле это ещё не сервер. Но терпение — все будет.

Исходный код.

Полный код проекта всегда можно будет взять из репозитория на Google code. Коммит с приведенной выше версией находится тут.

2011.09.02