Написание сервера работа довольно объемная, поэтому описание функций я планирую делать методом добавления новой функциональности в демо-версию сервера.
Начнем с небольшой заготовки, которая будет содержать:
- логгер
- считывание параметров
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. Коммит с приведенной выше версией находится тут.