Client-Server Application

Модератор: Absurd

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

13 июн 2005, 10:27

Вдохновлённый темой Создание сетевого приложения решил написать себе что-то.

Точнее сказать пока что это графическая доска: Java Web Graphic Board

Клиентскую часть я сделал, как Java-Applet (можно рисовать на Canvas), серверную - php (почему? Потому что большинство веб-серверов его поддерживает).

Код апплета, кому интересно, можно глянуть тут: Painter.java

Серверная часть сейчас очень проста:
По POST она принимает линии (4 int) и пишет в файл их и время добавления.
При обращении клиентов считывает всё, после последней метки считывания.

-----
1. Информацию пересылаю по HTTP - медленно,
через Sockets было бы, наверное, быстрее?..
Но ... у меня в локальной сети (общежитие) сокеты закрыты.
Кроме того, выход из сети через прокси (прямое соединения от сервера ко мне установить нельзя) и уверен, что такие ограничения не только у меня бывают.
Чтобы оставить универсальность программы - предпочитаю делать так, как есть


2. Работа с файлами - очень долго.
Как можно реализовать хранение и доступ к данным быстрее?
Писать в БД? Если будет много временных меток (вроди как пока что не предпологается) - было бы быстрее искать.
Иначе - всё равно ведь в конечном итоге из файлов читается, не так ли?

Что мне приходит в голову - поставить на сервере JBOSS, и запихнуть туда Session EJB, для каждого пользователя создаётся своё Бин и лежит в памяти (быстродоступно) до конца работы.

Но ... хотелось бы, относительной, универсальности кода.
А далеко не на всякий сервер можно выложить Бины ...
Не говоря уже о бесплатных серверах (а о чём иначе может быть речь при амматорском проэкте студента?..).

Хостинг с поддержкой сервлетов и jsp у меня есть.
Но, может ли это как-то помочь?

И последнее.
Графика это, конечно же, хорошо.
Но ... в планах было бы туда ещё звук прикрутить ...
Stream ....
Писать это в файлы или в БД - глупо ... наверное ...
Создавать файлы у пользователя в Апплете, аплоадить их на сервер, а потом отдавать по мере надобности?
Не представляю.

В общем.
Если у кого-то есть идеи/знания по этому поводу - буду рад их услышать!
Deady
Сообщения: 193
Зарегистрирован: 17 фев 2004, 13:13
Откуда: Москва
Контактная информация:

13 июн 2005, 12:43

1. объясни пожалуйста, что такое "сокет" в твоем понимании.
если будет работа с БД, то можно из апплета сразу к БД коннектиться (хотя так не рекомендуется делать)

2. сравнивать файлы и БД не вижу смысла. люди не для того БД годами придумывали, чтоб потом их заменяли на работу с файлами

если есть JBoss, то автоматически есть JSP и пр. смысла писать на php не вижу вообще.

сдается мне, в том примере доски не отрезки используются. там имхо матрица точек, она же и передается.
Deady
Сообщения: 193
Зарегистрирован: 17 фев 2004, 13:13
Откуда: Москва
Контактная информация:

13 июн 2005, 12:55

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

13 июн 2005, 16:00

Deady,
1. Сокет - канал связи с хостом по заданному ПОРТУ.
Пересылка пакетов из локальной сети во внешнюю разрешена (кажется) только по 80-му порту.
Хотя ... связь с БД строкой:
"jdbc :o racle:thin:@srvmatthes4.informatik.tu-muenchen.de:1521:dbprak"
удаётся натроить.

Почему не рекмендуется коннектится к БД из апплета?..

2. БД удобна для больших обьёмов информации и поиска в ней.
Если же информации не много и получать её нужно всю, то файлы должны быстрее работать,
так мне кажется.

3. JBOSSа нету ... Есть бесплатный хостинг лишь с Tomcat (вот там JSP и Servlet написать можно).

4. "смысла писать на php не вижу вообще"
Если на сервере нужно только записать в файл (БД) какая разница, делать это через Сервлет или через PHP?
Сервлеты разве будут быстрее?
Почему php - потому что в этом случае серверную часть можно будет поставить на любой сервер, поддерживающий PHP
(а таких больше, чем с поддержкой Java).

5. По DRAGG мышки рисуется отрезок от старого положения мышки до нового.
Причём, для получения данные, которые будут пересылаться на сервер (для уменьшения обьёма) отрезки складываются в длинные линии.
(Алгоритм преобразования отрезков в линии не идеальный, а потому бывают промежутки, улучшить это я постараюсь сам).

6. Данные на сервере хранятся сейчас в формате:

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

...
MICROTIMESTAMP 0.87798600 1118652480
60 138 60 137
67 110 67 108
67 110 67 109
67 108 69 106
69 105 71 103
69 105 70 104
71 103 72 102
...
Строка = Метка времени или линия (x1, y1, x2, y2)


7.
нужно в отдельном потоке время от времени передавать на сервер или последовательности отрезков, или можно находить изменившуюся часть рисунка и передавать ее в виде матрицы.
В отдельном потоке - это хорошая идея, спасибо!
Писать данные на сервер НЕ по концу драга, а по опрашиванию новых данных!
Уменьшится число обращений к серверу!

Что касается "изменившеюся часть рисунка .. в виде матрицы"
то .. передать пару линий (4 int) быстрее, чем передавать матрицу (прямоугольник X*X int) где основная часть будет белой!


-----

Основной вопрос:
Где и как хранить данные на сервере, чтобы доступ к ним был очень быстрым ?


"обмен можно делать например с помощью ObjectOutputStream"

Чем это лучше того, что я пишу Vector.add(int[4]) ?
Ведь всё равно эти данные потом записываются в POST при отправке на сервер.


"серверная часть просто хранит текущий холст в памяти (например в виде bean)"

Серверная часть, как я уже сказал в пункте 6 хранит не холст, а 4-точки для линий.
Хранить холст в памяти пользователя - он и так сохранён там.

На сервере - как сделат, чтобы обьект существовал постоянно?

Да, JBOSS и EJB это могут (насколько я понимаю), но у меня нет сервера с JBOSS.

Ведь вся проблема в том, что мне нужно хранить данные на сервере и отдавать их всем пользователям!

Немного обьясню, может я не понятно написал, суть всего этого дела:
5 (много) пользователей находятся на одной странице и одновременно рисуют на одном экране!
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

13 июн 2005, 17:03

На самом деле вопрос довольно сложный потому как:
если база хорошая - то быстрее будеть база
если база не лчень шустрая, то возможно что и файл.
Опять же пхп скорее шустрее отработает с файлами - просто вызовет системную функцию
Хотя винчестер - самое узкое место практически в любом компе.
Если хочешь знать точно насчет своего случая - то самый надежный способ проверить.
только на самм деле зачем если у тебя сервер с явой, то писать на пхп.
Напиши сервлетик - пусть он и кидает в БД.
Ява использует байт код а пхп - чисто интерпретируемый язык посему ява должна шустрее отработать
Плюс если хочешь быстрее - то лучше через сокеты данные толкать.
В SAD - все в SAD.
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

13 июн 2005, 17:04

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

13 июн 2005, 17:23

Kolinus,
спасибо за ответ!

Прочитал статью The Servlet Life Cycle.
Был ужжасно рад :D что сервлет есть одна инстанция в памяти!
Так что файлы и БД отпадают!
Буду хранить в переменных в оперативке, о чём я так мечтал ))


Deady,
"обмен можно делать например с помощью ObjectOutputStream"
Прошу прощения, я не правильно подумал, как оно работает.
Теперь понял, спасибо!
Это, опять же таки, то, что мне нужно!

поставил кофе, пошел за сигаретами ;)
Deady
Сообщения: 193
Зарегистрирован: 17 фев 2004, 13:13
Откуда: Москва
Контактная информация:

14 июн 2005, 11:48

по поводу: что передавать.
передача отрезкав и матрицы - это как векторная и спрайтовая графика. а опыт подсказывает, что спрайты работают быстрее.
пример:
пусть у тебя отложенная передача данных (как я и посоветовал - передавать только по запросу). я нарисую в маленьком квадрате (10*10) сотню отрезков. на отрезок - 4 байта*100 = 400 байт.
матрица: 10*10 = 100 байт, а с учетом того, что всего 2 цвета (ч/б) = то 100/8 = 13 байт.
Deady
Сообщения: 193
Зарегистрирован: 17 фев 2004, 13:13
Откуда: Москва
Контактная информация:

14 июн 2005, 11:50

почему лучше java+java чем java+php:
ну потому что во втором случае ты сможешь передавать данные только в рамках http запроса, не будет доступен тот же ObjectOutputStream.
и вообще, ты же не станешь ставить двигло от бмв на ауди...
Deady
Сообщения: 193
Зарегистрирован: 17 фев 2004, 13:13
Откуда: Москва
Контактная информация:

14 июн 2005, 11:52

по поводу "что почитать".
Core Servlets And JSP - там все хорошо описано. в частности есть глава про взаимодействие сервлетов и апплетов.
Ответить