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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многопользовательский клиент на сокетах, Работа чекрез сокеты многих юзеров 
:(
    Опции темы
MisterCleric
Дата 4.9.2009, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

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



Привет всем!
Ребята, наставьте на путь истинный. Собственно задача такая:
1. Процесинг банковских карточек: баланс, снятие, депозит и т.д.
2. Есть специальные службы, которые предоставляют данную функциональность по определенному протоколу через TCP-IP.
3. Есть написанная либа, которая все функции по работе с этими сервисами и выполняет.
4. Необходимо ее переписать так, что могло работать одновременно несколько пользоателей, так как предполагается эту либу использовать в web-приложении.
5. Взаимодействие с удаленным сервисом организовано через сокеты.

В этой области пока ничего не рублю.

Как типа все должно работать?
Нам предоставляют IP и порты, куда мы можем коннектится через сокеты, отправлять запросы в определенном формате, запакованные в байты и назад получать ответы в таком же виде.
Вопросы собственно такие:
а) Обязательно ли закрывать сокет после каждого его использования? Если нет, то можно ли организовать пул таких соединений? (Но вообще, я так понимаю, все зависит от того, как организована серверная часть: если она не поддерживает многопоточности, то будет блокировка на клиенте, пока не закончится предыдущий запрос. Ведь так?)
б) Если серверные сокеты (в моем случае) немногопоточны, то надо будет организовывать пул из предоставленных нам каналов. Держать ли сокеты в этом случае открытыми?
в) Какие стримы мне использовать для быстроты отправки и получения?
г) что такое SocketChannel и Selector и нужны ли они в моем случае?

Может есть, конечно, какие-то и другие вопросы, но я их пока не вижу. А что-то важное точно запряыталось...
Вот пример кода использования сокетов, который есть. Что в нем изменить, что бы была возможность нескольким пользователям одновременно отправлять запросы?
Код

        Socket sock = null;
        try {
            sock = new Socket();
            sock.connect(new InetSocketAddress(server_host, server_port), socket_create_timeout);
            return performSoleNetworkRequest(sock, requestISOMsg); // requestISOMsg запрос в определенном формате
        } finally {
            sock.close();
        }

protected byte[] performSoleNetworkRequest(final Socket sock, final ISOMsg requestISOMsg) throws Exception {

                OutputStream os = sock.getOutputStream();
                InputStream is = sock.getInputStream();

            os.write(requestISOMsg.pack());
            os.flush();

            int attemptsCnt = 0;
            int available = 0;
            do {
                Thread.sleep(this.getIteration_timeout()); // нужен ли здесь таймаут для ожидания ответа?
                attemptsCnt++;
            } while (((available = is.available()) == 0) && (attemptsCnt < this.getAttempts_count()));

            final byte[] response = new byte[available];
            is.read(response);

            return response;
        
    }


В общем, мож подскажите, что почитать?


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
AntonSaburov
Дата 4.9.2009, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Не совсем понятно со следующими вопросами:
1. Служба, с которой можно работать через TCP/IP - она серверная ? Т.е. к ней можно одновременно приконектиться несколькими клиентами ?
2. Библиотека, которая выполняет всю работу - она что предоставляет наружу ? API ? Она тред сейфная ?

Если предположить, что на первый вопрос ответ - да, серверная, а на второй - предоставляет некоторый API, то по идее надо просто написать Web-приложение, которое будет на сервлет принимать запросы от клиентов и вызывать либо через API. По идее это все.
PM MAIL WWW ICQ   Вверх
MisterCleric
Дата 4.9.2009, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

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



Цитата

она серверная ? 

Да.
Цитата

к ней можно одновременно приконектиться несколькими клиентами ?

Можно, но пока не известно одновременно ли.
Цитата

Библиотека, которая выполняет всю работу

Это моя библиотека, которая будет клиентов к тем сервисам. А заодно она будет предоставлять API для клиентских приложений. В моем случае это WEB.
Цитата

Она тред сейфная ?

Вот этот вопрос меня и смущает. Так метод, который посылает запросы через сокет как synchronized. А в многопользовательском режиме это будет выглядеть как все ждут одного, так как канал получается узковатым. От этого надо избавится. Плюс есть такое желание как "батчевые операции". Вот почему я и спрашивал: обязательно ли закрывать сокет сразу после его использования?


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
AntonSaburov
Дата 4.9.2009, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Под "серверная" я подразумевал, что у нее открыт серверный сокет, который может обслуживать много клиентов одновременно.
Если это не так, то твоя задача решения не имеет - каждый клиент будет эдать остальных.

Если же одновременно может, то тебе надо просто переписать несколько библиотеку. Если у тебя класс, который работает с внешним API через сокет тредсейфный, то проблем по идее быть не должно.
PM MAIL WWW ICQ   Вверх
cube
Дата 4.9.2009, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



сам имел опыт работы в банке...

ну лично мое мнение:

Там по любому открыт серверсокет

Цитата

Вот этот вопрос меня и смущает. Так метод, который посылает запросы через сокет как synchronized. А в многопользовательском режиме это будет выглядеть как все ждут одного, так как канал получается узковатым. От этого надо избавится. Плюс есть такое желание как "батчевые операции". Вот почему я и спрашивал: обязательно ли закрывать сокет сразу после его использования?


конечно он должен быть как synchronized, и избавиться от этого не получится...

Батчевые операции, я так понял это типа как addBatch() в jdbc, но это же не говорит что ты должен выполнять их "по-этапу"... Накопи на клиенте эти операции, а потом как и в jdbc вызови executeBatch()в этом же порядке отправишь их серверу.

Узкое место? Открой еще сокет на клиенте, подключись к серверу...Да, как ты писал где-то выше -  ты можешь создать пул таких соединений.

Потом при тесте ты сможешь лучше определить какой тебе пул и на сколько соединений лучше создавать...

Я понимаю что на первый взгляд есть библиотека, нужно только написать клиента - задача выглядит легко, но камней везде до фига... Страх - велик, но руки делают!)))


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

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

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


 




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


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

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