/* 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.io.IOException; import java.net.InetSocketAddress; import java.util.HashMap; import java.util.HashSet; import pspnetparty.lib.ICommandHandler; import pspnetparty.lib.ILogger; import pspnetparty.lib.IniFile; import pspnetparty.lib.IniSection; import pspnetparty.lib.constants.AppConstants; import pspnetparty.lib.constants.IniPublicServerRegistry; import pspnetparty.lib.engine.PortalEngine; import pspnetparty.lib.server.IniConstants; import pspnetparty.lib.server.ServerUtils; import pspnetparty.lib.socket.AsyncTcpServer; import pspnetparty.lib.socket.IProtocol; public class PortalServer { 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 = "PortalServer.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, 50000); if (port < 1 || port > 65535) { System.out.println("ポート番号が不正です: " + port); return; } System.out.println("ポート: " + port); ini.saveToIni(); ILogger logger = ServerUtils.createLogger(); AsyncTcpServer tcpServer = new AsyncTcpServer(40000); final PortalEngine engine = new PortalEngine(tcpServer, logger); connect(engine); InetSocketAddress bindAddress = new InetSocketAddress(port); tcpServer.startListening(bindAddress); 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サーバーを終了させる"); System.out.println("status\n\t現在のサーバーの状態を表示"); System.out.println("rooms\n\t保持している部屋情報の一覧"); System.out.println("server active\n\t接続中のサーバーの一覧"); System.out.println("server dead\n\t接続していないサーバーの一覧"); System.out.println("server reload\n\tサーバーリストを再読み込みして接続を更新する"); System.out.println("reconnect\n\t接続していないサーバーと再接続を試みる"); } }); handlers.put("status", new ICommandHandler() { @Override public void process(String argument) { System.out.println("ポート: " + port); System.out.println(engine.statusToString()); } }); handlers.put("rooms", new ICommandHandler() { @Override public void process(String argument) { System.out.println(engine.allRoomsToString()); } }); handlers.put("server", new ICommandHandler() { @Override public void process(String argument) { if ("active".equalsIgnoreCase(argument)) { System.out.println("[接続中のルームサーバーの一覧]"); printList(engine.listActiveRoomServers()); System.out.println("[接続中の検索サーバーの一覧]"); printList(engine.listActiveSearchServers()); } else if ("dead".equalsIgnoreCase(argument)) { System.out.println("[切断されたルームサーバーの一覧]"); printList(engine.listDeadRoomServers()); System.out.println("[切断された検索サーバーの一覧]"); printList(engine.listDeadSearchServers()); } else if ("reload".equalsIgnoreCase(argument)) { try { connect(engine); } catch (IOException e) { e.printStackTrace(); } } else { return; } } }); handlers.put("reconnect", new ICommandHandler() { @Override public void process(String argument) { engine.reconnectNow(); } }); ServerUtils.promptCommand(handlers); tcpServer.stopListening(); } private static void printList(String[] list) { for (String s : list) System.out.println(s); } private static void connect(PortalEngine engine) throws IOException { IniPublicServerRegistry publicServer = new IniPublicServerRegistry(); HashSet<String> addresses = new HashSet<String>(); for (String address : publicServer.getRoomServers()) { addresses.add(address); } engine.connectRoomServers(addresses); addresses.clear(); for (String address : publicServer.getSearchServers()) { addresses.add(address); } engine.connectSearchServers(addresses); addresses.clear(); for (String address : publicServer.getLobbyServers()) { addresses.add(address); } engine.connectLobbyServers(addresses); } }