Client-Server Application

Модератор: Absurd

Аватара пользователя
Oscar
Сообщения: 958
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

14 июн 2005, 16:39

Deady,

1.
по поводу: что передавать.
аргументацию на примере не понял
(a) почему во втором случае "делить"?
(b) в будущем планируется НЕ ОДИН цвет

интуитивно, как бы да!
много линий, накладываются, ок, но!
Зачем пользователю накладывать одну линию на другую?

Я бы хранил все линии в одном легкодоступном Обьекте (вектор, хэш, не знаю) и при прорисовке новых проверял бы, intersects ли новая линия одну из старых, чтобы избежать двух линий на одном месте (пока что ещё не представляю, как это сделать).

Другой вопрос: Как передавать спрайтовую графику на сервер?
Раз в секунду скидывать всю Графику апплета?
Накладывать на сервере Графики всех пользователей на одну и рассылать обратно?

Как я себе представляю - это будут рывки, при плохой связи так точно.

Если же я передаю линии:
Да, траффика может будет в конечном итоге и больше (хотя, это вовсе не обязательно должно быть!), но каждый раз будет пересылатся всего ОДНА линия! (4*int + цвет).
Таким образом это будет более равномерно.

И, кроме того, никто же не будет постоянно рисовать там одно на другом! Для того правая кнопка мышки и введена, чтобы стереть!


В общем пока ещё так и не определился.

2.
почему лучше java+java чем java+php:
ну потому что во втором случае ты сможешь передавать данные только в рамках http запроса, не будет доступен тот же ObjectOutputStream.
Да, хорошо. С этим я согласен.
ObjectOutputStream (ObjectInputStream) я уже настроил.
Работает оно тут: Applet-Servlet.html
, а коды всех классов можно видеть в корневом каталоге:
http://www.myjavaserver.com/~olegskr/

К сожалению, установить связь между апплетом и сервлетом через Сокеты не удалось (Access Denied, Permission, ...)
и вообще, ты же не станешь ставить двигло от бмв на ауди...
Я бы рассматривал это иначе.
Если бы не было явного преимущества в In(Out)putStream я бы делал серверную часть на php.
Если общение идёт исключительно "plain text" через HTTP - то какая разница, на чём сервер, а на чём клиент?
А, как я уже говорил, серверов с поддержкой PHP намного больше (а бесплатный с поддержко Java я вообще только один знаю).

Если нужно будет поделиться с кем-то кодом - php (или asp, perl, cgi) проще найти. И все они смогли бы работать с файлами.

Ну да ладно, теперь это уже не актуально, потому как со Стрим я разобрался, и мне очень понравилось! ))

3.
по поводу "что почитать".
Core Servlets And JSP - там все хорошо описано
Спасибо, но та статья ("The Servlet Life Cycle"), на которую я ссылался в прошлом мессадже,
оказалась главой из книги О'Рейлли "Java™ Servlet Programming", чему я очень доволен.
Сейчас её пролистываю по мере необходимости.


---

Опять возник вопрос: в чём хранить?
Все дело в том, что на myjavaserver.com классы довольно таки часто выгружают из памяти (минут 5-10 неактивности).
А потому, чтобы сохранить состояние между сеансами нужно выгружать содержание (которое хранится в переменных обьекта Сервлет, который, как оказалось ранее, имеет, грубо говоря, всего одну инстанцию) на жесткий диск.

Пример такой выгрузки тут: InitDestroyCounter
код доступен в корне (см. выше).

Но, поскольку эта операция будет происходить относительно редко, и она не должна быть супер быстрой, - то выгружать я буду в файл и не буду больше думать об этом.


И ещё один вопрос: Как идентифицировать пользователя?
Servlet(Remote IP)
Applet(Local IP)

У меня :
RemoteIP = IP Прокси-Сервера локальной сети
LocalIP = 127.0.0.1

Если я захочу "порисовать" вместе с человеком из моей сети - будут проблемы.

(Зачем мне нужно IP? Список пользователей, состояние online).

Есть ли возможность как-то получить что-то типа:
X-Forwarded-From (или как там его) ?

Тогда я буду идентифицировать по (RemoteIP+LocalIP).

В сервлете RemoteIP я вывожу также Header, но там нету необходмой мне информации.
Вообще, это возможно то, что я хочу?
Аватара пользователя
Oscar
Сообщения: 958
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

15 июн 2005, 00:24

Oscar писал(а):Другой вопрос: Как передавать спрайтовую графику на сервер?
Создал я, значиться, в апплете картинку:

Код: Выделить всё

Image offscreen = createImage&#40]

Переменная [b]offscreen[/b] в результате оказалась класса [b]sun.awt.image.OffScreenImage[/b]  :? 

Был очень удивлён, открыв для себя, что оно знает какой-то пакет [b]sun[/b]

Апплет сам по себе отрабатывает на "ура"!
Рисую линию по [b]MouseDragged[/b] в этот самый [b]offgraphics[/b],
после чего делаю [b]repaint[/b]  изменённого прямоугольника.

В методе [b]paint[/b]  делаю:
[code]	public void paint(Graphics graphics) {
		graphics.drawImage(offscreen, 0, 0, null);
	}
Всё, как по нотам!
Моментально рисует, обновляет маленькую область шустро.
Если свернуть/развернуть окно - аккуратненько прорисовывает всё заново.

Ок, решил передать это на сервер.
И шо вы думаете?...
Java писал(а):java.io.NotSerializableException: sun.awt.image.OffScreenImage
:(

Попытался создать класс

public class PainterImage extends Image implements Serializable

Что как писать - не понял, понял, что гемороя будет много.
Кроме того, в апплете я ведь всё равно получу этот самый SUNовский OffScreenImage, который привести к моему PainterImage вряд ли удасться.
Что делать? Полностью переписывать свой PainterImage по типу OffScreenImage и добавлять в него сериализацию! Нет уж, увольте ...

Как результат всех этих изощрений - решил вернуться к своим линиям .. Буду передавать Vector(int[4]), который таки есть serializable.

Если кто-то знает как можно это делать иначе - буду рад услышать умную мысль.
Ответить