|
|
|||||
Регистрация: Dec 2006
Сообщений: 24
|
Java socket
Пытаюсь подключить флеш as3 к java через сокет. Связь есть, но в момент отключения игрока он не всегда удаляется из массива игроков.
Вкратце: в java для каждого нового игрока создаю новый поток и добавляю его в ArrayList. Удаление из массива происходит в момент срабатывания исключения (когда игрок закрывает флешку и связь пропадает). Но через какое то время элементов в ArrayList становится явно больше, чем должно быть. Хотя когда тестирую сам, все работает правильно. Вот такой вот скрипт (в яве совсем новичок). Скрипт в ответ на любой запрос клиента отвечает размером ArrayList. JAVA public class Server { private static final int PORT_SERVER = 2000; static List<Player> mas_player = new ArrayList<Player>(); public static void main(String[] args) { try { ServerSocket server = new ServerSocket(PORT_SERVER); while(true) { Socket clientSocket = server.accept(); Player client = new Player(clientSocket, mas_player); mas_player.add(client); client.start(); } } catch(Exception e) {System.out.println("Error init "+e);} } } class Player extends Thread { public Socket s; DataInputStream in; DataOutputStream out; List<Player> mas_player; public Player(Socket p1, List<Player> mas_player) { s = p1; this.mas_player = mas_player; } public void run() { String line = null; try { InputStream sin = s.getInputStream(); OutputStream sout = s.getOutputStream(); in = new DataInputStream(sin); out = new DataOutputStream(sout); while(true) { line = in.readUTF(); line = String.valueOf(mas_player.size()); out.writeUTF(line); out.flush(); } } catch(Exception e) { try { mas_player.remove(this); out.close(); s.close(); } catch(Exception ee) { System.out.println("Error thread "+ee); } } } } |
|
|||||
Регистрация: Apr 2009
Сообщений: 409
|
а почему слушаете именно исключение? Это вполне штатная ситуация и в конце сессии клиент должен передавать end
|
|
|||||
Цитата:
Уже давно придуманы механизмы проверки участия клиента. Самый простой вариант - heart_beat. Раз в определенный интервал времени, к примеру секунда, клиент и сервер обмениваются "сердцебиением", то есть просто короткое сообщение (любое, я всегда слал просто hb, чтобы было понятно), и если клиент прислал серверу ответ на его запрос hb, то сервер считает, что клиент онлайн и не отключает его. Может возникнуть ситуация задержки в сети, поэтому сервер, если не получил ответ, должен еще какое-то время подждать. Если этот таймаут истек, и ответ так и не получен, значит клиент отключился и нужно удалить его из списка активных. Рассчитывать на Exception глупо, сервер может считать, что клиент не отключился и держать его в своем списке как нормального
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Регистрация: Dec 2006
Сообщений: 24
|
Видимо, так и сделаю, спасибо! И всё же странно, что Exception срабатывает, грубо говоря, в 90% случаях или даже чаще, а иногда нет.
|
|
|||||
Не за что)
В том, что эксепшен срабатывает как попало нет ничего странного, это же джава. В джаве вообще многое как попало работает. У меня была реалтайм игра с сервером на джаве, я себе все нервы чуть не потратил, пока для него модули делал
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Немного не в тему, делал так же сокет на с#.NET+моно, тоже пихал код сокетов из примеров, постоянно были какие то мелкие глючки и невнятности в работе. Пока не заюзал либу SuperSocket, всё сразу вылечилось и встало на свои места. Причем судя по внутренностям, самому такой код написать нереально выделив даже ближайший год. Наверняка под яву есть подобные решения.
|
|
|||||
Цитата:
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
С netbeans не сталкивался, андроид студио и джейайдеа вроде ниче, не заметил там глюков
|
|
|||||
Цитата:
Конечно если писать код все время в idea и потом открывать андроид студио, то кажется, что все норм, но я сравниваю с FD и MS Visual Studio. Последняя, кстати, несмотря на свои огромные размеры, работает на удивление быстро и хорошо, лично для меня, писать в VS одно удовольствие, чего не могу сказать об андроид студио
__________________
Ко мне можно и нужно обращаться на ты) |
Часовой пояс GMT +4, время: 09:24. |
|
« Предыдущая тема | Следующая тема » |
|
|