Работа сервера на 2 локальные сети

Теги:
 
+
-
edit
 

Dekster

новичок
Собственно сабж. Можно ли это реализовать на сборках, основанных на L2JFree?
 
UA SoulKeeper #02.03.2007 17:35
+
-
edit
 

SoulKeeper

разработчик L2J Fortress

Можно. Переписать логику определения ип-шников.
Разыскивается десятка с два датапакеров :) http://la2.wrk.ru/forum/viewtopic.php?id=50882  
+
-
edit
 

Satrik

новичок
У меня тоже 3 сетки на сервере, 1 внешка (Интернет) и две локалки.
SoulKeeper дай пожалуйста пищу для размышления.
Как это можно реализовать?
 
UA SoulKeeper #09.03.2007 23:36
+
-
edit
 

SoulKeeper

разработчик L2J Fortress

Сначала реализуй проверку на принедлежность адреса определенному диапазону. Т.е. 160.160.160.0-160.160.160.255 (к примеру). Потом создаем список диапазонов, в зависимости от принадлежности ип к диапазону отдаем ранее указаный ip для этого промежутка.
Разыскивается десятка с два датапакеров :) http://la2.wrk.ru/forum/viewtopic.php?id=50882  
RU Satrik #14.03.2007 21:10  @SoulKeeper#09.03.2007 23:36
+
-
edit
 

Satrik

новичок
SoulKeeper> Сначала реализуй проверку на принедлежность адреса определенному диапазону. Т.е. 160.160.160.0-160.160.160.255 (к примеру). Потом создаем список диапазонов, в зависимости от принадлежности ип к диапазону отдаем ранее указаный ip для этого промежутка.

Ткни носом в исходники ... в какой файл лезть?
Где прописан алгоритм подключения?
 
UA SoulKeeper #14.03.2007 22:32
+
-
edit
 

SoulKeeper

разработчик L2J Fortress

Тебе алгоритм не нужен, тебе нужно то какой ip отсылает логинсервер клиенту. Лезть в логинсервер, там меньше 10-ти файлов не считая пакеты.
Разыскивается десятка с два датапакеров :) http://la2.wrk.ru/forum/viewtopic.php?id=50882  
+
-
edit
 

Zioner

новичок
Я так понял это тут надо править src\main\java\net\sf\l2j\loginserver\serverpackets\ServerList.java

code text
  1.         class ServerData
  2.         {
  3.                 String ip;
  4.                 int port;
  5.                 boolean pvp;
  6.                 int currentPlayers;
  7.                 int maxPlayers;
  8.                 boolean testServer;
  9.                 boolean brackets;
  10.                 boolean clock;
  11.                 int status;
  12.                 public int server_id;
  13.                
  14.                 ServerData(String Ip, int Port, boolean Pvp, boolean TestServer, int CurrentPlayers, int MaxPlayers, boolean Brackets, boolean Clock, int Status, int Server_id)
  15.                 {
  16.                         this.ip = Ip;
  17.                         this.port = Port;
  18.                         this.pvp = Pvp;
  19.                         this.testServer = TestServer;
  20.                         this.currentPlayers = CurrentPlayers;
  21.                         this.maxPlayers = MaxPlayers;
  22.                         this.brackets = Brackets;
  23.                         this.clock = Clock;
  24.                         this.status = Status;
  25.                         this.server_id = Server_id;
  26.                 }
 
UA SoulKeeper #15.03.2007 15:51
+
-
edit
 

SoulKeeper

разработчик L2J Fortress

накой в пакеты полез?
Разыскивается десятка с два датапакеров :) http://la2.wrk.ru/forum/viewtopic.php?id=50882  
+
-
edit
 

Zioner

новичок
Я так понял что через ServeList.java передаётся информацио о сервере включая IP
 
+
-
edit
 

Satrik

новичок
А по моему в ClientThread.java
code text
  1. ServerList sl = GameServerTable.getInstance().makeServerList(lc.isGM(account), _internalIP);
 
RU SoulMaster #15.09.2007 14:51
+
-
edit
 

SoulMaster

втянувшийся

Та же проблема! Помогите пожалуйста! Если это действительно так просто, как говорит SoulKeeper, было бы не плохо, если бы и с кодом помогли...Сделайте доброе дело...Заранее спасибо.
Клик по аватаре -> репутация -> +(-)1 если конечно помог =)  
UA SoulKeeper #18.09.2007 23:26
+
-
edit
 

SoulKeeper

разработчик L2J Fortress

Я даже когда-то такое писал, но по ходу код потерян, а писать заново нет особого желания :)
Разыскивается десятка с два датапакеров :) http://la2.wrk.ru/forum/viewtopic.php?id=50882  
RU Mister #19.09.2007 21:52  @SoulKeeper#18.09.2007 23:26
+
-
edit
 

Mister

новичок
SoulKeeper> Я даже когда-то такое писал, но по ходу код потерян, а писать заново нет особого желания :)
ну памаги нам я допустим для сборки RT-team хотелось бы зделать чтоб могли канектися с локалок
 
RU SoulMaster #20.09.2007 16:51
+
-
edit
 

SoulMaster

втянувшийся

Народ ждет..а я смотря им в честные глаза говорю..скоро-скоро и вы сможете вместе играть..неужели я их обманываю? SoulKeeper, выручай..в джаве я 0, а ЛС сделать надо. Помоги пожалуйста.
Клик по аватаре -> репутация -> +(-)1 если конечно помог =)  
UA SoulKeeper #20.09.2007 21:49  @SoulMaster#20.09.2007 16:51
+
-
edit
 

SoulKeeper

разработчик L2J Fortress

SoulKeeper>> Я даже когда-то такое писал, но по ходу код потерян, а писать заново нет особого желания :)
Mister> ну памаги нам я допустим для сборки RT-team хотелось бы зделать чтоб могли канектися с локалок

Для РТ никак помочь не смогу, исходников нет. Хотя они и так молча возьмут и даже не напишут "Thx to автор". Сколько раз уже такое было, свинством называется...

SoulMaster> Народ ждет..а я смотря им в честные глаза говорю..скоро-скоро и вы сможете вместе играть..неужели я их обманываю? SoulKeeper, выручай..в джаве я 0, а ЛС сделать надо. Помоги пожалуйста.

Нуууу.... :D

Ладно, я сегодня добрый :)

все писалось на скорую руку, так что за работоспособность не ручаюсь, т.к. не тестилось.

Для начала нам нужен простенький роутер
code text
  1. package l2f.loginserver;
  2.  
  3. import java.io.File;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6.  
  7. import l2f.util.Util;
  8. import l2f.util.CSVReader;
  9.  
  10. /**
  11.  * @author: Death
  12.  */
  13. public class Router
  14. {
  15.         private static final HashMap<Integer, HashMap<String, String>> table = new HashMap<Integer, HashMap<String, String>>();
  16.  
  17.         static
  18.         {
  19.                 init();
  20.         }
  21.  
  22.         private static void init()
  23.         {
  24.                 File f = new File("RouteTable.csv");
  25.  
  26.                 if(!f.exists())
  27.                         return;
  28.  
  29.                 CSVReader reader = new CSVReader(f.getName());
  30.                 reader.setSplitSymbol("\t");
  31.                 reader.setSkipLineSymbol("#");
  32.                 reader.setSkippingEmptyLines(true);
  33.  
  34.                 ArrayList<String[]> result = reader.readCSV();
  35.  
  36.                 // Структура файла: id сервера, диапазон ip либо одиночный ip, одиночный ip куда перенаправлять
  37.                 // Колонки разделять кнопкой "Tab"
  38.                 // Пример: 1      127.0.0.1-127.0.0.2     127.0.0.3
  39.                 // Пример: 6      255.255.255.255 255.255.10.4
  40.  
  41.                 for(String[] s : result)
  42.                 {
  43.                         int i = Integer.parseInt(s[0]);
  44.  
  45.                         HashMap<String, String> map = table.get(i);
  46.  
  47.                         if(map == null)
  48.                         {
  49.                                 map = new HashMap<String, String>();
  50.                                 table.put(i, map);
  51.                         }
  52.  
  53.                         map.put(s[1], s[2]);
  54.                 }
  55.         }
  56.  
  57.         public static String routeIP(String clientIP, String serverIP, int serverId)
  58.         {
  59.                 HashMap<String, String> map = table.get(serverId);
  60.  
  61.                 if(map == null)
  62.                         return serverIP;
  63.  
  64.                 for(String s : map.keySet())
  65.                 {
  66.                         if(Util.checkIfInRange(clientIP, s))
  67.                                 return map.get(s);
  68.                 }
  69.                 return serverIP;
  70.         }
  71. }


Клас CSVReader написаный давным давно и успешно используемый как библиотечный.

code text
  1. package l2f.util;
  2.  
  3. import java.util.ArrayList;
  4. import java.io.LineNumberReader;
  5. import java.io.File;
  6. import java.io.FileInputStream;
  7. import java.io.FileNotFoundException;
  8. import java.io.InputStreamReader;
  9.  
  10. /**
  11.  * @Author Death
  12.  * @version 0.1
  13.  *
  14.  * Этот файл предназначен для быстрого считывания CSV-файлов.
  15.  */
  16. public class CSVReader
  17. {
  18.         private String _filePath;
  19.         private String _encoding;
  20.         private String _splitSymbol;
  21.         private boolean _skipEmptyLines;
  22.         private String _skipLineSymbol;
  23.  
  24.         public CSVReader()
  25.         {
  26.                 //Просто пустой конструктор
  27.         }
  28.  
  29.         public CSVReader(String filepath)
  30.         {
  31.                 _filePath = filepath;
  32.         }
  33.  
  34.         public CSVReader(String filepath, String splitSymbol)
  35.         {
  36.                 _filePath = filepath;
  37.                 _splitSymbol = splitSymbol;
  38.         }
  39.  
  40.         public CSVReader(String filepath, String splitSymbol, boolean skipEmptyLines)
  41.         {
  42.                 _filePath = filepath;
  43.                 _splitSymbol = splitSymbol;
  44.                 _skipEmptyLines = skipEmptyLines;
  45.         }
  46.  
  47.         public CSVReader(String filepath, String splitSymbol, boolean skipEmptyLines, String skipLineSymbol)
  48.         {
  49.                 _filePath = filepath;
  50.                 _splitSymbol = splitSymbol;
  51.                 _skipEmptyLines = skipEmptyLines;
  52.                 _skipLineSymbol = skipLineSymbol;
  53.         }
  54.  
  55.         public CSVReader(String filepath, String splitSymbol, boolean skipEmptyLines, String skipLineSymbol, String encoding)
  56.         {
  57.                 _filePath = filepath;
  58.                 _splitSymbol = splitSymbol;
  59.                 _skipEmptyLines = skipEmptyLines;
  60.                 _skipLineSymbol = skipLineSymbol;
  61.                 _encoding = encoding;
  62.         }
  63.  
  64.         public String getFilePath()
  65.         {
  66.                 return _filePath;
  67.         }
  68.  
  69.         public void setFilePath(String filePath)
  70.         {
  71.                 _filePath = filePath;
  72.         }
  73.  
  74.         public String getEncoding()
  75.         {
  76.                 return _encoding;
  77.         }
  78.  
  79.         public void setEncoding(String encoding)
  80.         {
  81.                 _encoding = encoding;
  82.         }
  83.  
  84.         public String getSplitSymbol()
  85.         {
  86.                 return _splitSymbol;
  87.         }
  88.  
  89.         public void setSplitSymbol(String symbol)
  90.         {
  91.                 _splitSymbol = symbol;
  92.         }
  93.  
  94.         public boolean isSkippingEmptyLines()
  95.         {
  96.                 return _skipEmptyLines;
  97.         }
  98.  
  99.         public void setSkippingEmptyLines(boolean skipEmptyLines)
  100.         {
  101.                 _skipEmptyLines = skipEmptyLines;
  102.         }
  103.  
  104.         public void setSkipLineSymbol(String s)
  105.         {
  106.                 _skipLineSymbol = s;
  107.         }
  108.  
  109.         public String getSkipLineSymbol()
  110.         {
  111.                 return _skipLineSymbol;
  112.         }
  113.  
  114.         /**
  115.          * Считывает файл используя пердыдушие настройки кроме пути к файлу.
  116.          * @param file файл для чтения
  117.          * @return ArrayList<String[]>
  118.          */
  119.         public ArrayList<String[]> readFile(File file)
  120.         {
  121.                 String oldFilePath = _filePath;
  122.                 _filePath = file.getAbsolutePath();
  123.                 ArrayList<String[]> ret = readCSV();
  124.                 _filePath = oldFilePath;
  125.                 return ret;
  126.         }
  127.  
  128.         /**
  129.          * Считывает файл по указаному пути используя предыдущие настройки и игнорирует путь к файлу.
  130.          * @param filePath путь к файлу
  131.          * @return ArrayList<String[]>
  132.          */
  133.         public ArrayList<String[]> readCSV(String filePath)
  134.         {
  135.                 String oldFilePath = _filePath;
  136.                 _filePath = filePath;
  137.                 ArrayList<String[]> ret = readCSV();
  138.                 _filePath = oldFilePath;
  139.                 return ret;
  140.         }
  141.  
  142.         /**
  143.          * Считывает CSV файл и возвращает разделенный по колонокам.
  144.          * @return ArrayList<String[]>
  145.          */
  146.         public ArrayList<String[]> readCSV()
  147.         {
  148.                 ArrayList<String[]> strings = new ArrayList<String[]>();
  149.  
  150.                 LineNumberReader lnr;
  151.                 File f = new File(_filePath);
  152.  
  153.                 try
  154.                 {
  155.  
  156.                         if(!f.exists() || !f.canRead())
  157.                                 throw new FileNotFoundException("File ""+f.getAbsolutePath()+"" not found or can't be readed");
  158.  
  159.                         if(_encoding != null && !_encoding.equals(""))
  160.                                 lnr = new LineNumberReader(new InputStreamReader(new FileInputStream(f), _encoding));
  161.                         else
  162.                                 lnr = new LineNumberReader(new InputStreamReader(new FileInputStream(f)));
  163.  
  164.                         String line;
  165.  
  166.                         while((line = lnr.readLine()) != null)
  167.                         {
  168.                                 if(_skipEmptyLines && (line.equals("") || containsOnly(line, _splitSymbol)))
  169.                                         continue;
  170.  
  171.                                 if(_skipLineSymbol != null && !_skipLineSymbol.equals("") && line.startsWith(_skipLineSymbol))
  172.                                         continue;
  173.  
  174.                                 strings.add(line.split(_splitSymbol));
  175.                         }
  176.  
  177.                         lnr.close();
  178.                 }
  179.                 catch(Exception e)
  180.                 {
  181.                         e.printStackTrace();
  182.                 }
  183.  
  184.                 return strings;
  185.         }
  186.  
  187.         private static boolean containsOnly(String string, String splitSymbol)
  188.         {
  189.                 char[] q = splitSymbol.toCharArray();
  190.                 for(char x : string.toCharArray())
  191.                 {
  192.                         if(x != q[0])
  193.                                 return false;
  194.                 }
  195.                 return true;
  196.         }
  197. }


Собственно эти файлы нужно кинуть в папки по package

к примеру l2f.util означает что его надо кинуть в папку .../java/l2f/util/

Далее создаем файл "RouteTable.csv" и бросаем его в корневую папку логин сервера.

Файл имеет структуру:

колонка 1 = id сервера
колонка 2 = диапазон ip(или конкретный ip для роутинга)
колонка 3 = куда роутить

Пустые строки игнорируются
Строки которые начинаются с "#" игнорируются
колонки разделяются кнопкой "Tab"


Пример файла
code text
  1. 1       255.255.250.40-255.255.255.232  192.42.43.15
  2. 2       197.56.72.17    92.10.5.143


Собсвенно создаем, сохраняем и созхраняем.

Далее открываем файлик
code text
  1. l2f/util/Util.java

Находим строчку
code text
  1. static boolean checkIfInRange(String ip, String ipRange)


заменяем на
code text
  1. public static boolean checkIfInRange(String ip, String ipRange)


Сохраняем :)

Далее открываем файлик
code text
  1. l2f/loginserver/GameServerTable.java


находим код
code text
  1. public ServerList makeServerList(boolean isGM, boolean _internalip, Socket con)
  2.         {
  3.                 orderList();
  4.                 ServerList sl = new ServerList();
  5.                 boolean updated = false;
  6.                 for(GameServer gs : _gameServerList)
  7.                 [color=red]{[/color]
  8.                         if(gs.hexID == null)
  9.                                 continue;
  10. [code]
  11.  
  12. дописываем после него
  13.  
  14. [code]
  15.                         String intIp = Router.routeIP(con.getInetAddress().getHostAddress(), gs.internal_ip, gs.server_id);
  16.                         String extIp = Router.routeIP(con.getInetAddress().getHostAddress(), gs.ip, gs.server_id);


Далее после этих строк и до конца цикла for (закрытие крсной скобки)

заменяем

code text
  1. gs.internal_ip

на
code text
  1. intIp


и
code text
  1. gs.ip

code text
  1. extIp


Сохраняем, компилируем, заменяем jar, запускаем, радуемся роутингу.
Разыскивается десятка с два датапакеров :) http://la2.wrk.ru/forum/viewtopic.php?id=50882  
UA SoulKeeper #20.09.2007 21:57  @SoulKeeper#20.09.2007 21:49
+
-
edit
 

SoulKeeper

разработчик L2J Fortress

Т.к. у Балансера на форуме срывает крышу от тегов пост в аттаче :)

На нормальном форуме запостите - оно отформатирует.
Разыскивается десятка с два датапакеров :) http://la2.wrk.ru/forum/viewtopic.php?id=50882  
UA SoulKeeper #20.09.2007 21:59
+
-
edit
 

SoulKeeper

разработчик L2J Fortress

Мде... Аттачи тоже не пашут :) Странно как форум вообще работает :D

Dump.Ru - обмен файлами, бесплатный файловый хостинг

бесплатное хранение, обмен и публикация файлов, фотохостинг, видеохостинг, регистрация не обязательна, количество файлов не ограничено

// dump.ru
 
Разыскивается десятка с два датапакеров :) http://la2.wrk.ru/forum/viewtopic.php?id=50882  
UA SoulKeeper #20.09.2007 22:00
+
-
edit
 

SoulKeeper

разработчик L2J Fortress

P.S. Balancer, поставь VB-шку или IPB :D
Разыскивается десятка с два датапакеров :) http://la2.wrk.ru/forum/viewtopic.php?id=50882  
RU SoulMaster #21.09.2007 17:10
+
-
edit
 

SoulMaster

втянувшийся

Кип, огромное тебе спасибище..все ясно отписано..МОЛОДЕЦ =)
П.С.
P.S. Balancer, поставь VB-шку или IPB
 

Или SMF..классная штука.
Клик по аватаре -> репутация -> +(-)1 если конечно помог =)  
UA SoulKeeper #21.09.2007 19:43
+
-
edit
 

SoulKeeper

разработчик L2J Fortress

Хз, но Balancer доломал форум :)
Разыскивается десятка с два датапакеров :) http://la2.wrk.ru/forum/viewtopic.php?id=50882  
Это сообщение редактировалось 21.09.2007 в 20:19
RU SoulMaster #21.09.2007 20:54
+
-
edit
 

SoulMaster

втянувшийся

Плин, SoulKeeper, тут исходники, но не РусТим, я попытался что-то сделать, но нефига не выходит, т.к. например static boolean checkIfInRange(String ip, String ipRange) такого вообще нету..помоги пожалуйста.!
Вот необходимые сурсы сервера Ссылка запрещена по требованию [показать]
Клик по аватаре -> репутация -> +(-)1 если конечно помог =)  
UA SoulKeeper #21.09.2007 21:52
+
-
edit
 

SoulKeeper

разработчик L2J Fortress

Ну эту функцию я написал где-то 8 месяцев назад, потом она кочирувала в фортресс :)

Копирни функцию целиком
Разыскивается десятка с два датапакеров :) http://la2.wrk.ru/forum/viewtopic.php?id=50882  
RU SoulMaster #21.09.2007 22:53
+
-
edit
 

SoulMaster

втянувшийся

хех..не получается. Пытался, честно. =(
Клик по аватаре -> репутация -> +(-)1 если конечно помог =)  
UA SoulKeeper #22.09.2007 00:00
+
-
edit
 

SoulKeeper

разработчик L2J Fortress

Плохо пытался значит :)

Оно хоть скомпилилось?
Разыскивается десятка с два датапакеров :) http://la2.wrk.ru/forum/viewtopic.php?id=50882  
AD Реклама Google — средство выживания форумов :)
RU SoulMaster #22.09.2007 00:14
+
-
edit
 

SoulMaster

втянувшийся

Завтра еще разок попробую..и напишу,просто вставать рано..да и "Утро вечера..."
Клик по аватаре -> репутация -> +(-)1 если конечно помог =)  
Это сообщение редактировалось 22.09.2007 в 16:19

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru