Для РТ никак помочь не смогу, исходников нет. Хотя они и так молча возьмут и даже не напишут "Thx to автор". Сколько раз уже такое было, свинством называется...
Нуууу....
все писалось на скорую руку, так что за работоспособность не ручаюсь, т.к. не тестилось.
package l2f.loginserver;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import l2f.util.Util;
import l2f.util.CSVReader;
/**
* @author: Death
*/
public class Router
{
private static final HashMap<Integer, HashMap<String, String>> table = new HashMap<Integer, HashMap<String, String>>();
static
{
init();
}
private static void init()
{
File f = new File("RouteTable.csv");
if(!f.exists())
return;
CSVReader reader = new CSVReader(f.getName());
reader.setSplitSymbol("\t");
reader.setSkipLineSymbol("#");
reader.setSkippingEmptyLines(true);
ArrayList<String[]> result = reader.readCSV();
// Структура файла: id сервера, диапазон ip либо одиночный ip, одиночный ip куда перенаправлять
// Колонки разделять кнопкой "Tab"
// Пример: 1 127.0.0.1-127.0.0.2 127.0.0.3
// Пример: 6 255.255.255.255 255.255.10.4
for(String[] s : result)
{
int i = Integer.parseInt(s[0]);
HashMap<String, String> map = table.get(i);
if(map == null)
{
map = new HashMap<String, String>();
table.put(i, map);
}
map.put(s[1], s[2]);
}
}
public static String routeIP(String clientIP, String serverIP, int serverId)
{
HashMap<String, String> map = table.get(serverId);
if(map == null)
return serverIP;
for(String s : map.keySet())
{
if(Util.checkIfInRange(clientIP, s))
return map.get(s);
}
return serverIP;
}
}
Клас CSVReader написаный давным давно и успешно используемый как библиотечный.
package l2f.util;
import java.util.ArrayList;
import java.io.LineNumberReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
/**
* @Author Death
* @version 0.1
*
* Этот файл предназначен для быстрого считывания CSV-файлов.
*/
public class CSVReader
{
private String _filePath;
private String _encoding;
private String _splitSymbol;
private boolean _skipEmptyLines;
private String _skipLineSymbol;
public CSVReader()
{
//Просто пустой конструктор
}
public CSVReader(String filepath)
{
_filePath = filepath;
}
public CSVReader(String filepath, String splitSymbol)
{
_filePath = filepath;
_splitSymbol = splitSymbol;
}
public CSVReader(String filepath, String splitSymbol, boolean skipEmptyLines)
{
_filePath = filepath;
_splitSymbol = splitSymbol;
_skipEmptyLines = skipEmptyLines;
}
public CSVReader(String filepath, String splitSymbol, boolean skipEmptyLines, String skipLineSymbol)
{
_filePath = filepath;
_splitSymbol = splitSymbol;
_skipEmptyLines = skipEmptyLines;
_skipLineSymbol = skipLineSymbol;
}
public CSVReader(String filepath, String splitSymbol, boolean skipEmptyLines, String skipLineSymbol, String encoding)
{
_filePath = filepath;
_splitSymbol = splitSymbol;
_skipEmptyLines = skipEmptyLines;
_skipLineSymbol = skipLineSymbol;
_encoding = encoding;
}
public String getFilePath()
{
return _filePath;
}
public void setFilePath(String filePath)
{
_filePath = filePath;
}
public String getEncoding()
{
return _encoding;
}
public void setEncoding(String encoding)
{
_encoding = encoding;
}
public String getSplitSymbol()
{
return _splitSymbol;
}
public void setSplitSymbol(String symbol)
{
_splitSymbol = symbol;
}
public boolean isSkippingEmptyLines()
{
return _skipEmptyLines;
}
public void setSkippingEmptyLines(boolean skipEmptyLines)
{
_skipEmptyLines = skipEmptyLines;
}
public void setSkipLineSymbol(String s)
{
_skipLineSymbol = s;
}
public String getSkipLineSymbol()
{
return _skipLineSymbol;
}
/**
* Считывает файл используя пердыдушие настройки кроме пути к файлу.
* @param file файл для чтения
* @return ArrayList<String[]>
*/
public ArrayList<String[]> readFile(File file)
{
String oldFilePath = _filePath;
_filePath = file.getAbsolutePath();
ArrayList<String[]> ret = readCSV();
_filePath = oldFilePath;
return ret;
}
/**
* Считывает файл по указаному пути используя предыдущие настройки и игнорирует путь к файлу.
* @param filePath путь к файлу
* @return ArrayList<String[]>
*/
public ArrayList<String[]> readCSV(String filePath)
{
String oldFilePath = _filePath;
_filePath = filePath;
ArrayList<String[]> ret = readCSV();
_filePath = oldFilePath;
return ret;
}
/**
* Считывает CSV файл и возвращает разделенный по колонокам.
* @return ArrayList<String[]>
*/
public ArrayList<String[]> readCSV()
{
ArrayList<String[]> strings = new ArrayList<String[]>();
LineNumberReader lnr;
File f = new File(_filePath);
try
{
if(!f.exists() || !f.canRead())
throw new FileNotFoundException("File ""+f.getAbsolutePath()+"" not found or can't be readed");
if(_encoding != null && !_encoding.equals(""))
lnr = new LineNumberReader(new InputStreamReader(new FileInputStream(f), _encoding));
else
lnr = new LineNumberReader(new InputStreamReader(new FileInputStream(f)));
String line;
while((line = lnr.readLine()) != null)
{
if(_skipEmptyLines && (line.equals("") || containsOnly(line, _splitSymbol)))
continue;
if(_skipLineSymbol != null && !_skipLineSymbol.equals("") && line.startsWith(_skipLineSymbol))
continue;
strings.add(line.split(_splitSymbol));
}
lnr.close();
}
catch(Exception e)
{
e.printStackTrace();
}
return strings;
}
private static boolean containsOnly(String string, String splitSymbol)
{
char[] q = splitSymbol.toCharArray();
for(char x : string.toCharArray())
{
if(x != q[0])
return false;
}
return true;
}
}
Далее создаем файл "RouteTable.csv" и бросаем его в корневую папку логин сервера.
1 255.255.250.40-255.255.255.232 192.42.43.15
2 197.56.72.17 92.10.5.143
Собсвенно создаем, сохраняем и созхраняем.
static boolean checkIfInRange(String ip, String ipRange)
public static boolean checkIfInRange(String ip, String ipRange)
l2f/loginserver/GameServerTable.java
public ServerList makeServerList(boolean isGM, boolean _internalip, Socket con)
{
orderList();
ServerList sl = new ServerList();
boolean updated = false;
for(GameServer gs : _gameServerList)
[color=red]{[/color]
if(gs.hexID == null)
continue;
[code]
дописываем после него
[code]
String intIp = Router.routeIP(con.getInetAddress().getHostAddress(), gs.internal_ip, gs.server_id);
String extIp = Router.routeIP(con.getInetAddress().getHostAddress(), gs.ip, gs.server_id);