Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кл.-серверное приложение. Протокол взаимодействия. 
:(
    Опции темы
ci5
Дата 29.12.2012, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 24.12.2008

Репутация: нет
Всего: нет



Здравствуйте.
Сервер может обрабатывать около 300 соединений. Думал реализовать всё на сокетах, но есть одно но. Надо при определенных событиях сервера, делать уведомление всех клиентов об этом событии. Что-то некого бродкаста должно быть. Вот тут то я и не совсем понимаю, как это на сокетах реализовать(или вовсе не на сокетах). Реализовать через POST и GET запросы я так понимаю тут невозможно, ибо нужно держать соединение с клиентами и уведомлять их о событиях независимо от передачи ими данных, что HTTP не поддерживает. Кто что может подсказать по данному вопросу? Клиенты сами подключаются и отключаются.
Заранее спасибо
PM MAIL   Вверх
jManiak
Дата 29.12.2012, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 6.2.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 1



А чем вам все-таки сокеты не нравятся? Рассылка всем (или некоторым) делается на ура.
PM MAIL ICQ   Вверх
danilych
Дата 30.12.2012, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 2.2.2011

Репутация: 3
Всего: 3



посмотри atmosphere фреймворк и cometD фреймворк - небольшое описание тут

Это сообщение отредактировал(а) danilych - 30.12.2012, 01:45
PM MAIL   Вверх
ci5
Дата 30.12.2012, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 24.12.2008

Репутация: нет
Всего: нет



jManiak, я просто работал с клиент-серверными приложениями на сокетах, там суть была в запросе клиента и ответа сервера. И друг от друга они ждут указаний на блокирующих методах.
Код

                switch(switchConnection) { 
                    case SEND_DATA: 
                        oos.writeObject(chiefs);
                        oos.writeObject(staff);
                        closeStreams(); 
                        break;
                    case ACCEPT_DATA:
                        chiefs = (List)ois.readObject();
                        staff = (List)ois.readObject();
                        parsing.setChiefs(chiefs);
                        parsing.setStaff(staff);
                        parsing.saveData();
                        parseData(); 
                        closeStreams();
                        break;
                }

Вот как делал до этого. Но проблема была в том, что я делал подключение и указывал команду. А тут надо держать соединение. А как сделать спонтанно, что бы можно было клиентам уже подключенным передать команду, ума не приложу. Извиняюсь если глупость спрашиваю, но понять вот этот момент никак не могу, как это будет реализовано. Делать два соединения? Один для общения обычными командами, а другой для слушания сервера? 
danilych, к сожалению не могу использовать посторонние фреймворки. Исключительно Java SE. Но за помощь всё равно спасибо. 
PM MAIL   Вверх
jManiak
Дата 30.12.2012, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 6.2.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 1



А кто мешает держать соединение на сокетах? Они собственно для этого и предназначены. Не нужно закрывать соединения. Сохраняйте у себя объекты соединений и когда потребуются, используйте их.
PM MAIL ICQ   Вверх
COVD
Дата 30.12.2012, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Цитата

Вот тут то я и не совсем понимаю, как это на сокетах реализовать(или вовсе не на сокетах). Реализовать через POST и GET запросы я так понимаю тут невозможно, ибо нужно держать соединение с клиентами и уведомлять их о событиях независимо от передачи ими данных, что HTTP не поддерживает.

Любая коммуникация между компьютерами реализуется на сокетах (ничего другого нет). Но по-разному. Если отправляются байтовые сообщения, то, очевидно, речь идет о  протоколе на основе TCP (если используются TCP сокеты) . Если в сообщения добавляются текстовые заголовки, составленные в соответствии со спецификацией HTTP, то получаем  HTTP протокол. Если клиентские приложения соединяются с сервером через интернет, то HTTP  предпочтительнее, так это стандарт для интернета и позволяет избежать ограничений, связанных с файерволами.

Чтобы сервер мог уведомлять клиентов, сервер должен держать соединения с клиентами. Или клиенты должны сами периодически опрашивать сервер. В этом случае задержка уведомления зависит еще и от периода опроса.

HTTP позволяет организовать псевдопостоянные соединения. Сервер, отвечая на запрос клиента, может это делать бесконечно долго. Однако бесконечный ответ иногда приводит к тому, что антивирус на клиенте не пропускает ответ, пока не получит конец. Поэтому идеальным является серия относительно длительных соединений. Технологии comet , ajax как раз и используют возможности HTTP для реализации серии относительно длительных соединений.

 
PM MAIL   Вверх
ci5
Дата 6.1.2013, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 24.12.2008

Репутация: нет
Всего: нет



Благодарю за ответы. 
COVD, к сожалению, нет возможности пользоваться ничем, кроме стандартного JavaSE. 
У меня могут передаваться как массив со строками, так и булева значения. В принципе, можно переделать архитектуру так, что бы можно было передавать только текстовые сообщения. 
Но тут, как новичка в HTTP, интересует три вопроса: 
1. Как понимать, что клиент отключился? 
2. Как держать соединение с клиентом? Их же надо будет уведомлять о событиях, независимо от их действий. Сервер же ничего не знает про клиентов, он может только что-то отправить в отклик, когда клиент что-то запросит. 
3. Как это реализовать на SE? Раньше только на EE реализовывал, на сервлетах, где обработчиком был веб сервер. А тут как? 
Или всё же тут сокеты предпочтительней? 
PM MAIL   Вверх
jk1
Дата 6.1.2013, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Цитата

3. Как это реализовать на SE? Раньше только на EE реализовывал, на сервлетах, где обработчиком был веб сервер. А тут как? 


Код

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

public class Test {

    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
        server.createContext("/test", new MyHandler());
        server.setExecutor(null); // creates a default executor
        server.start();
    }

    static class MyHandler implements HttpHandler {
        public void handle(HttpExchange t) throws IOException {
            String response = "This is the response";
            t.sendResponseHeaders(200, response.length());
            OutputStream os = t.getResponseBody();
            os.write(response.getBytes());
            os.close();
        }
    }

}



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
COVD
Дата 7.1.2013, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



На сокетах придется самому программировать парсирование http заголовков.
Проще использовать встроенный в SE веб-сервер, пример которого привел jk1.
Для получения уведомлений клиенты должны периодически слать запрос (polling). Надо только самому реализовать сессии клиентов и туда класть уведомления. Если запросы с определенным jsessionid прекратили поступать, сессия через некоторое время удаляется (по таймауту). 
PM MAIL   Вверх
ci5
Дата 9.1.2013, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 24.12.2008

Репутация: нет
Всего: нет



Благодарю! Но я реализовал это дело через сокеты всё же. Клиент в два потока, первый посылает команды, второй принимает. Сервер же в основном потоке делает рассылку всем, либо кому надо. В потоках непосредственно для клиентов получает данные. Получилось довольно гибко. 
Но возьму на заметку про SE веб сервер. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0901 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.