/*
Copyright (C) 2011 monte
This file is part of PSP NetParty.
PSP NetParty is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package pspnetparty.server;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import pspnetparty.lib.ICommandHandler;
import pspnetparty.lib.ILogger;
import pspnetparty.lib.IniFile;
import pspnetparty.lib.IniSection;
import pspnetparty.lib.Utility;
import pspnetparty.lib.constants.AppConstants;
import pspnetparty.lib.constants.IServerRegistry;
import pspnetparty.lib.engine.LobbyEngine;
import pspnetparty.lib.engine.PortalEngine;
import pspnetparty.lib.engine.RoomEngine;
import pspnetparty.lib.engine.SearchEngine;
import pspnetparty.lib.server.IniConstants;
import pspnetparty.lib.server.ServerUtils;
import pspnetparty.lib.socket.AsyncTcpServer;
import pspnetparty.lib.socket.AsyncUdpServer;
import pspnetparty.lib.socket.IProtocol;
public class AllInOneServer {
public static void main(String[] args) throws Exception {
System.out.printf("%s オールインワンサーバー version %s\n", AppConstants.APP_NAME, AppConstants.VERSION);
System.out.println("プロトコル: " + IProtocol.NUMBER);
String iniFileName = "AllInOneServer.ini";
switch (args.length) {
case 1:
iniFileName = args[0];
break;
}
System.out.println("設定INIファイル名: " + iniFileName);
IniFile ini = new IniFile(iniFileName);
IniSection settings = ini.getSection(IniConstants.SECTION_SETTINGS);
final int port = settings.get(IniConstants.PORT, 20000);
if (port < 1 || port > 65535) {
System.out.println("ポート番号が不正です: " + port);
return;
}
System.out.println("ポート: " + port);
String hostname = settings.get("HostName", "localhost");
if (Utility.isEmpty(hostname)) {
System.out.println("ホスト名が設定されていません: " + hostname);
return;
}
System.out.println("ホスト名: " + hostname);
final String loginMessageFile = settings.get(IniConstants.LOGIN_MESSAGE_FILE, "");
System.out.println("ルームログインメッセージファイル : " + loginMessageFile);
ILogger logger = ServerUtils.createLogger();
AsyncTcpServer tcpServer = new AsyncTcpServer(100000);
AsyncUdpServer udpServer = new AsyncUdpServer();
IServerRegistry registry = new IServerRegistry() {
@Override
public void reload() {
}
@Override
public boolean isValidPortalServer(InetAddress address) {
return true;
}
@Override
public String[] getPortalServers() {
return null;
}
@Override
public String[] getRoomServers() {
return null;
}
@Override
public String[] getSearchServers() {
return null;
}
@Override
public String[] getLobbyServers() {
return null;
}
@Override
public Iterator<String> getPortalRotator() {
return null;
}
};
{
int maxRooms = settings.get(IniConstants.MAX_ROOMS, 10);
if (maxRooms < 1) {
System.out.println("部屋数が不正です: " + maxRooms);
return;
}
System.out.println("最大部屋数: " + maxRooms);
RoomEngine roomEngine = new RoomEngine(tcpServer, udpServer, logger, registry);
roomEngine.setMaxRooms(maxRooms);
roomEngine.setLoginMessageFile(loginMessageFile);
}
{
int maxUsers = settings.get(IniConstants.MAX_USERS, 30);
if (maxUsers < 1) {
System.out.println("最大検索ユーザー数が不正です: " + maxUsers);
return;
}
System.out.println("最大検索ユーザー数: " + maxUsers);
int maxSearchResults = settings.get(IniConstants.MAX_SEARCH_RESULTS, 50);
if (maxSearchResults < 1) {
System.out.println("最大検索件数が不正です: " + maxSearchResults);
return;
}
System.out.println("最大検索件数: " + maxSearchResults);
int descriptionMaxLength = settings.get(IniConstants.DESCRIPTION_MAX_LENGTH, 100);
if (descriptionMaxLength < 1) {
System.out.println("部屋の詳細・備考の最大サイズが不正です: " + descriptionMaxLength);
return;
}
System.out.println("部屋の詳細・備考の最大文字数: " + descriptionMaxLength);
SearchEngine searchEngine = new SearchEngine(tcpServer, logger, registry);
searchEngine.setMaxUsers(maxUsers);
searchEngine.setMaxSearchResults(maxSearchResults);
searchEngine.setDescriptionMaxLength(descriptionMaxLength);
}
{
LobbyEngine lobbyEngine = new LobbyEngine(tcpServer, logger, registry);
lobbyEngine.setLoginMessageFile(loginMessageFile);
}
ini.saveToIni();
PortalEngine portalEngine = new PortalEngine(tcpServer, logger);
String address = hostname + ":" + port;
HashSet<String> addresses = new HashSet<String>();
addresses.add(address);
InetSocketAddress bindAddress = new InetSocketAddress(port);
tcpServer.startListening(bindAddress);
udpServer.startListening(bindAddress);
portalEngine.connectRoomServers(addresses);
portalEngine.connectSearchServers(addresses);
portalEngine.connectLobbyServers(addresses);
HashMap<String, ICommandHandler> handlers = new HashMap<String, ICommandHandler>();
handlers.put("help", new ICommandHandler() {
@Override
public void process(String argument) {
System.out.println("shutdown\n\tサーバーを終了させる");
}
});
ServerUtils.promptCommand(handlers);
tcpServer.stopListening();
udpServer.stopListening();
}
}