![]() |
Java xSocket сервер, зависание. Как исправить?
Всем привет. Где-то полторы недели назад, прочитал статью о том как создать простой сервер на Java, подключая к нему Flash.
Вот она: http://giantflyingsaucer.com/blog/?p=205 После этого в порыве восторга, начал делать игру. Делал быстро, попутна изучая способы взаимодействия - оптимизации. За основу был взят сервер из статьи, т.к. я знаю Java, на уровне стандартного языка(тоесть условия, перемнные) написал простенькую проверку на версию флешки(дабы блокировать людей с прошлой версии) Собственно основной класс сервера: Код:
package xsocketchatserver;Игра была онлайн - реалтайм. Насчет этого не ругайте. Игра предназначалась не для интернета, а для локальной сети. Все бы хорошо, игру я сделал, сделал неплохо. Но по прохождению некоторого времени, когда подключается новый игрок(перед этим много кто уходит - приходит) Или если написать сообщение в чат. Сервер просто зависает. Никакой ошибки, ничего, просто перестает отвечать на запросы. И не отключается. Единственный способ - перезапуск. Может кто помочь с этой проблемой? При подключении идет отправка трех данных: Код AS3:
При получении этих данных, сервер отправляет их всем клиентам, там уже выясняется, что где должно создаться, переместиться. 1-я команда говорит тем кто в игре что он подключился, и он появляется у них. 2-я команда говорит что он требует их данных чтобы создать их у себя. После того как сервер отправит эту команду всем клиентам, все клиенты отправят снова запрос на сервер уже о том, что они есть в игре. 3-я команда выводит сообщение в чат, о том что игрок подключился. 1. Из-за чего может быть зависание? 2. Я считаю из-за того что в одну единицу времени приходит много запросов, и сервер не выдержав нагрузки - погибает... Если так, как можно синхронизировать данные с сервером, тоесть чтобы небыло хаотичного принял-отправил? Если никак, просто попытаться уменьшить кол-во запросов? Или вообще не в этом дело? Заранее спасибо.. :victory: |
Ну, если заходит второй игрок и зависает, то точно можно сказать, что это не из-за количества запросов, так как два игрока завалить сервер запросами просто не в состоянии ... рассчитано на тысячи игроков (ну, сотни-то уж точно).
Если бы ты смог локализовать ошибку (зависание), было бы проще. Из того, что сразу бросается в глаза - ты пишешь в синхронизированный поток, но не отправляешь (nbConn.flush()) - логично предположить, что пока он не очистится (отправится или перегрузится), с ним ничего не сделаешь - будет в подвешенном состоянии. Предположение основано на аналогичной работе неблокирующего сервлета. Однако смущает описание функции .write() суперинтерфейса INonBlo... - IConnection: "sends ... to the remote endpoint" - то есть не помещение данных в поток для отправки, а именно отправка данных. Правда, наличие flush успокаивает. Попробуй - вдруг поможет. |
Спасибо, но попробывал.. Не помогло(((
Вот зависание с flush... И последние данные с сервера Вот пример последних принимаемых данных: Код:
Incoming data: FDoKENatOR~724.7§29.5§164.9§120 - данные о положении приходят каждые 0.16 секПроанализировав данные я думаю что проблема в отключении игрока. onData: channel is closed (read buffer size=0) так как после нее уже нет ответа на отправленные данные. Можно это исправить? Или может дело в Incoming data: <policy-file-request/> Насчет захлебывания и правда я ошибся, т.к. было до 10 человек.. И все было нормально. Буду благодарен за помощь! PS: Еще заметил то, что нет строчки onDisconnect которая показывает отключившегося... Да и еще одна вещь, проанализировал простое подключение - отключение Код:
onConnectДобавлено через 1 час 20 минут Хм немного покапашись и добавив небольшую проверочку, вот: Код:
onConnect - первое подключение |
Всем спасибо! Проблему решил...
Как решил - создал 2 сервера, изначально флешка подключается к первому, получает файл политики, отключает соединение(чтобы не нагружать этот сервер) и подключается уже к основному, и файл политики уже не требуется! Вот как оказалось все просто ;D |
PeTa4eK, Вы не сталкивались ли с эксепшном "Too many files"? И если да, то как его локализовали?
Как я понял из доков, xSocket кэширует в себе открытые соединения и они остаются даже после того, как клиент давно отключился, однако что-то попытки поиграть с параметрами ни к чему хорошему так и не привели. |
Я уже ушел из xSocket, на C#, ибо как-то удобней))
Соединение можно закрыть. Глянь тутор: http://giantflyingsaucer.com/blog/?p=224 И все поймешь. |
Тутор этот я видел. ))
Сам сейчас перезжаю на Apache Mina, просто думал, вдруг чего не учел. Уж больно простой вариант был с xSocket. Соединения, как я понял, он кэширует у себя внутри. |
| Часовой пояс GMT +4, время: 03:14. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.