powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как правильно написать общение объектов через сокеты?
59 сообщений из 59, показаны все 3 страниц
Как правильно написать общение объектов через сокеты?
    #38310839
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача у меня такая:

Я получаю от объекта 1 через сокет А команду (у меня там сокет-сервер), ее конвертирую в нужный формат и отправляю через сокет Б(клиент) объекту 2.

Возможны следующие ситуации:

1) Каноническая: принимаю команду через сокет А, конверчу, отправляю в сокет Б
2) То же самое, но должен дождаться ответа из сокета Б и передать ответ через сокет А объекту 1. Если ответа в течение определенного времени не получено, передаю в сокет А сообщение об ошибке
3) Иногда ситуация обратная: приходит команда из сокета Б и ее нужно сконвертировать и отправить в сокет А

У меня опыта работы с сокетами мало и потому я запутался. Короче, как правильные джависты такие случаи программируют?
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38310897
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно решить два вопроса. Протокол транспорта
TCP, HTTP что-то ещё?
Протокол сериализации
Java, protobuf, JSON и т.д.

TCP + Java сериализация это RMI.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38310898
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38310906
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12,
автор дождаться ответа
- это не Java, а БЛ - Связь Мастер-Мастер (двунаправленная) или Мастер --> Клиент (однонаправленная)
- всё таки - "Ответ" или просто "сообщение в обратную сторону"?
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38310941
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123всё таки - "Ответ" или просто "сообщение в обратную сторону"?
В сторону А-> Б посылается либо команда, либо запрос. В обратную сторону посылается либо ответ на запрос, либо, например, сообщение об ошибке. Иногда сообщение об ошибке может возникать само по себе, не привязанное к запросу. Т.е. из Б в А посылается просто сообщение.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38310956
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНужно решить два вопроса. Протокол транспорта
TCP, HTTP что-то ещё?
Протокол сериализации
Java, protobuf, JSON и т.д.

TCP + Java сериализация это RMI.
Протокол транспорта TCP , а "команда" - это xml-последовательность в сторону ( А->Б ) и что-то типа текстовой строки с разделителями в обратную сторону. Чисто-конкретно десктопное приложение - на одном сокете сервер (общение с объектом 1), на другом (общение с объектом 2)- клиент. Объекты 1 и 2 - там не мои программы, я просто обеспечиваю их взаимодействие...
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38310977
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так в чем проблема? Сделайте RMI обертку. Зачем какой-то XML гонять? Если и там и там Java, то почему бы не передавать сразу объекты. Даже если остро нужен XML, то лучше использовать XML сериализацию, а XML API.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311007
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczТак в чем проблема? Сделайте RMI обертку. Зачем какой-то XML гонять? Если и там и там Java, то почему бы не передавать сразу объекты. Даже если остро нужен XML, то лучше использовать XML сериализацию, а XML API.
Нет, "там" и "там" как раз не джава.

Объект 1 - это некий иноземный прибор, который по TCP через сокет шлет xml-команды, которые я должен принять, переконвертировать и переправить через сокет Б объекту 2, который также для меня внешний, и написан не на джаве. Мне даются два протокола обмена (с одной стороны xml-команды, c другой - текст с разделителями.)

Я должен принять, переконвертировать, отдать, иногда дождаться ответа и передать его. А иногда - просто передать сообщения в обратную сторону, не инициированные запросом со стороны объекта 1.

Я запутался как лучше это сделать - и в плане разнопоточности и в плане взаимодействия и синхронизации действий. Синхронизацию потоков как таковую я представляю, а как вот правильно все организовать в моем конкретном случае - не представляю... Ну, по простому туплю чего-то...
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311024
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12Нет, "там" и "там" как раз не джава.
Объект 1 - это некий иноземный прибор, который по TCP через сокет шлет xml-команды, которые я должен принять, переконвертировать и переправить через сокет Б объекту 2, который также для меня внешний, и написан не на джаве. Мне даются два протокола обмена (с одной стороны xml-команды, c другой - текст с разделителями.)

Я должен принять, переконвертировать, отдать, иногда дождаться ответа и передать его. А иногда - просто передать сообщения в обратную сторону, не инициированные запросом со стороны объекта 1.

Я запутался как лучше это сделать - и в плане разнопоточности и в плане взаимодействия и синхронизации действий. Синхронизацию потоков как таковую я представляю, а как вот правильно все организовать в моем конкретном случае - не представляю... Ну, по простому туплю чего-то...
Ну, вот. Хоть какая-то конкретника. "Разнопоточность". 8)
А что за два сокета тогда???
Есть девайс, он работает с сервером? И есть GUI, который работает с тем же сервером? Так?
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311037
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12,
если это девайс, тогда он должен иметь протокол более высокого уровня.
Либо тогда к девайсу цепляется драйвер на другом ЯП для трансляции
Прибор+драйвер-транслятор ----> внешние системы
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311054
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12Если ответа в течение определенного времени не получено, передаю в сокет А сообщение об ошибке
не бойся выложить ПРОТОКОЛ работы чужлго прибора1.
Там должен быть тайм-аут ожидания ответа. А также вероятно технические пинги-команды для подтверждения коннекта.
- может ли быть несколько приборов или клиентов?
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311085
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else121) Каноническая: принимаю команду через сокет А, конверчу, отправляю в сокет Б
2) То же самое, но должен дождаться ответа из сокета Б и передать ответ через сокет А объекту 1. Если ответа в течение определенного времени не получено, передаю в сокет А сообщение об ошибке
3) Иногда ситуация обратная: приходит команда из сокета Б и ее нужно сконвертировать и отправить в сокет А
в принципе, так бери и пиши:
- модуль получения XML (тут было)
- модуль конвертации XML в КомандаА (шаблон Команда для крутости)
- модуль-переменная хранения состояния для запроса-таймаута
- ....
Удачи!
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311095
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Прибор+драйвер-транслятор ----> внешние системы
Да, оно.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311099
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12Petro123Прибор+драйвер-транслятор ----> внешние системы
Да, оно.
т.к. у тебя вся работа по факту Драйвер на сокетах.
Java не лучший ЯП для этого.
Удачи!
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311109
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123не бойся выложить ПРОТОКОЛ работы чужлго прибора1.
Там страниц эдак на 30-40...

Petro123Там должен быть тайм-аут ожидания ответа. А также вероятно технические пинги-команды для подтверждения коннекта.
- может ли быть несколько приборов или клиентов?
Эт как? Прибор - он внешний. А мой "драйвер-конвертор" - это по сути демон на компьютере. В сокет этому компьютеру приходят команды, в другой сокет уходят преобразованные в другой формат те же команды... Один "прибор" со стороны 1 и другой - со стороны 2.

Petro123в принципе, так бери и пиши:
- модуль получения XML (тут было) - уже написал
- модуль конвертации XML в КомандаА (шаблон Команда для крутости) - уже написал
- модуль-переменная хранения состояния для запроса-таймаута - а вот тут я и запнулся - как эту всю лабуду синхронизировать?
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311116
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНу, вот. Хоть какая-то конкретника. "Разнопоточность". 8)
А что за два сокета тогда???
Есть девайс, он работает с сервером? И есть GUI, который работает с тем же сервером? Так?
Собственно, уже описал схему. ГУИ там нет, это что-то типа демона-драйвера -конвертора. "Сервер" - я имел в виду сокет, через который я принимаю команду от объекта 1 - сервер с моей стороны по отношению к объекту 1. А отправляю команду на объект 2 и принимаю оттуда ответ - через сокет, который "клиент" по отношению к объекту 2. Так мне поставлена задача...
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311145
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123т.к. у тебя вся работа по факту Драйвер на сокетах.
Java не лучший ЯП для этого.
Удачи!
Собственно, не принципиально. Какая разница. Я с++ знаю хуже, поэтому и пишу на джаве (остальные знакомые языки не кросс-платформенны). Главное, чтобы работала.

Проблема в том, что не соображу как все правильно синхронизировать...
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311171
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12Собственно, уже описал схему. ГУИ там нет, это что-то типа демона-драйвера -конвертора. "Сервер" - я имел в виду сокет, через который я принимаю команду от объекта 1 - сервер с моей стороны по отношению к объекту 1. А отправляю команду на объект 2 и принимаю оттуда ответ - через сокет, который "клиент" по отношению к объекту 2. Так мне поставлена задача...
"объект" это экземпляр класса. Удаленная сторона, обычно называется tier. Чем больше вы используете термины не по назначению, тем сложнее вас понять.

У вас один сокет серверный, а второй клиентский? Т.е. серверный может получать данные из разных источников, а клиентский может получать\отправлять только синхронно? Так?
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311207
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12- модуль-переменная хранения состояния для запроса-таймаута - а вот тут я и запнулся - как эту всю лабуду синхронизировать?
- я вас спрашивал - надо ли по протколу пинговать? Если нет, то проще.

Приведи пример, какую ошибку надо отправить при отсутствии ответа Б-А.
Почему нельзя САМОМУ А реагировать на отсутствие ответа Б-А? Тогда тебя посередине НИЧЕГО не будет волновать - получил - передал.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311224
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если между клиентом и сервером не просто запрос-ответ, а запрос-ответ + какие-то уведомления от сервера, то нужно брать сокеты из nio ( http://docs.oracle.com/javase/7/docs/api/java/nio/channels/package-summary.html), а лучше какую-нибудь обертку на ними ( http://netty.io/). Для такого сценария на блокирующие сокеты лучше даже сразу не смотреть т.к. для такой схемы вы ничего кроме головной боли не получите.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311230
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwa,
если клиент один, то вроде блокировать некому....
Конечно, надо нагрузку на канал знать...
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311236
rfq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12Petro123т.к. у тебя вся работа по факту Драйвер на сокетах.
Java не лучший ЯП для этого.
Удачи!
Собственно, не принципиально. Какая разница. Я с++ знаю хуже, поэтому и пишу на джаве (остальные знакомые языки не кросс-платформенны). Главное, чтобы работала.
Совершенно здравое рассуждение. Меньше слушайте критиканов (которые делают громкие заявления, не подкрепляя доказательствами).
else12Проблема в том, что не соображу как все правильно синхронизировать...
Для начала нарисуйте картинку - как от объекта к объекту у вас движутся сообщения (включая сигналы таймера). Типа таких, которые подсказывает гугл "картинки по запросу data flow" на Data flow diagram . Теперь картинку надо формализировать: везде поставить стрелки, и выписать условие прохождения сообщений через узлы. Типичные условия: узел одновременно обрабатывает не более одного сообщения, узел начинает обработку когда сообщения пришли на все входы, после обработки сообщения удаляются со входов и пересылаются дальше и т.п. Наиболее близкая и понятная математическая модель - сети Петри , но надо избегать ситуаций, когда из одной позиции идут стрелки на несколько переходов - эти ситуации трудно реализуются. Собственно это и будет синхронизация. Останется эту картинку реализовать, но это другой вопрос. Когда покажете картинку, вым сразу подскажут.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311253
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczУ вас один сокет серверный, а второй клиентский?
Да

BlazkowiczТ.е. серверный может получать данные из разных источников, а клиентский может получать\отправлять только синхронно? Так?
Не совсем. Серверный является серверным только потому, что такие условия мне выкатили, а так он получает сигнал из одного источника. Клиентский (сокет Б) в основном работает в режиме "получил информацию -> переправил в выходной поток -> получил ответ -> передал для передачи в сокет А"

Иногда клиентский сокет получает ответ безо всякого запроса.

При этом надо отследить, чтобы, если долго нет ответа (заданное число милисекунд), то это воспринялось как ошибка даже в случае, если информация запоздало придет.

Собственно, вот...
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311261
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12то это воспринялось как ошибка
кем воспринялось?
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311264
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123 я вас спрашивал - надо ли по протколу пинговать? Если нет, то проще.
Не надо.

Petro123Приведи пример, какую ошибку надо отправить при отсутствии ответа Б-А.
Обычный простейший xml с тегами <Error>, <ErrorCode>

Petro123Почему нельзя САМОМУ А реагировать на отсутствие ответа Б-А? Тогда тебя посередине НИЧЕГО не будет волновать - получил - передал.
Тут условия заданы поставщиком оборудования - реагируем мы, а не он. Он ,скотина такая, просто ждет и потом реагирует на наш ответ.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311267
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы все входящие сообщения складировал был в очередь. Или даже две очереди. А выделеными потоками (по одному на сокет) разгребал очередь и записывал в сокеты. Проверять время можно по той же очереди.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311269
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123else12то это воспринялось как ошибка
кем воспринялось?
Мною. Моим демоном-драйвером. Воспринялось как ошибка и передалось в сокет А. При этом, если ответ все же придет, но поздно, то его надо проигнорировать.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311275
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12Petro123пропущено...

кем воспринялось?
Мною. Моим демоном-драйвером. Воспринялось как ошибка и передалось в сокет А. При этом, если ответ все же придет, но поздно, то его надо проигнорировать.
ТЫ - лишнее звено))))
Не возлагай на себя лишних полномочий))).
Ты - конвертер.
Если конечно, Прибор А сам умеет считать таймАут ответа.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311278
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЯ бы все входящие сообщения складировал был в очередь. Или даже две очереди. А выделеными потоками (по одному на сокет) разгребал очередь и записывал в сокеты. Проверять время можно по той же очереди.
Тут важна скорость, т.к. "не ответ" в течение какого-то времени должен расцениваться как ошибка - а складирование и потом разгребание - это все же время.

Кстати, а "очередь" в данном контексте это будет что конкретно?
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311281
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123else12пропущено...

Мною. Моим демоном-драйвером. Воспринялось как ошибка и передалось в сокет А. При этом, если ответ все же придет, но поздно, то его надо проигнорировать.
ТЫ - лишнее звено))))
Не возлагай на себя лишних полномочий))).
Ты - конвертер.
Если конечно, Прибор А сам умеет считать таймАут ответа.
Да я-то с удовольствием все полномочия скину, но у меня ТЗ, а в нем написано, что таймаут ответа как раз я должен считать...
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311290
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12Тут важна скорость, т.к. "не ответ" в течение какого-то времени должен расцениваться как ошибка - а складирование и потом разгребание - это все же время.

Положить ссылку на объект в коллекцию это просто уйма времени.
Смысл в том, что запись в сокеты вам всё равно надо как-то синхронизировать. И тормозить оно начнет в первую очередь тогда, когда вы начнете куда-попало synchronized пихать.

else12Кстати, а "очередь" в данном контексте это будет что конкретно?
Если нужна скорость, то какую-нибудь реализацию java.util.Queue (см ExecutorService, Executors) - http://docs.oracle.com/javase/tutorial/essential/concurrency/exinter.html
Если нужны транзакционность и сохранение данных, то какое-нибудь легковесное NoSQL хранилище.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311292
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rfqДля начала нарисуйте картинку - как от объекта к объекту у вас движутся сообщения (включая сигналы таймера). Типа таких, которые подсказывает гугл "картинки по запросу data flow" на Data flow diagram . Теперь картинку надо формализировать: везде поставить стрелки, и выписать условие прохождения сообщений через узлы. Типичные условия: узел одновременно обрабатывает не более одного сообщения, узел начинает обработку когда сообщения пришли на все входы, после обработки сообщения удаляются со входов и пересылаются дальше и т.п. Наиболее близкая и понятная математическая модель - сети Петри , но надо избегать ситуаций, когда из одной позиции идут стрелки на несколько переходов - эти ситуации трудно реализуются. Собственно это и будет синхронизация. Останется эту картинку реализовать, но это другой вопрос. Когда покажете картинку, вым сразу подскажут.
Я боюсь, что про сети Петри я помню только то, что я их когда-то, очень давно, изучал, но забыл напрочь, то есть абсолютно... А словесно схему я, вроде как, обрисовал... Или как-то "не очень" обрисовал?
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311297
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczelse12Тут важна скорость, т.к. "не ответ" в течение какого-то времени должен расцениваться как ошибка - а складирование и потом разгребание - это все же время.

Положить ссылку на объект в коллекцию это просто уйма времени.
Смысл в том, что запись в сокеты вам всё равно надо как-то синхронизировать. И тормозить оно начнет в первую очередь тогда, когда вы начнете куда-попало synchronized пихать.

else12Кстати, а "очередь" в данном контексте это будет что конкретно?
Если нужна скорость, то какую-нибудь реализацию java.util.Queue (см ExecutorService, Executors) - http://docs.oracle.com/javase/tutorial/essential/concurrency/exinter.html
Если нужны транзакционность и сохранение данных, то какое-нибудь легковесное NoSQL хранилище.
Аааа... А то у меня уже начал в мозгу реализовываться сложный механизм очередей... Если это просто коллекции и т.п., то еще ладно...
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311301
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12Или как-то "не очень" обрисовал?
Ну, так...
Может взять какой-то готовый Proxy и дописать в него нужную логику?
http://grinder.sourceforge.net/g3/tcpproxy.html
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311323
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12Да я-то с удовольствием все полномочия скину, но у меня ТЗ, а в нем написано, что таймаут ответа как раз я должен считать...
ну тогда считай, раз не можешь уточнить зачем считать...и что делать если в А таймаут на ответ 5 сек. А в драйвере 10 сек. И наоборот.
...
Если считать, то

Код: java
1.
2.
ПеременнаяТаймАут - константа = 10000 млсек
ПеременнаяВремяПоследнегоЗапроса - 


- Отнять и посчитать сможешь?
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311329
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczelse12Или как-то "не очень" обрисовал?
Ну, так...
Может взять какой-то готовый Proxy и дописать в него нужную логику?
http://grinder.sourceforge.net/g3/tcpproxy.html
Честно говоря, с прокси очень плохо знаком (в смысле программирования). А чем простые сокеты не подходят? Единственное, что не очень понял насчет "блокирующих" - "не блокирующих" сокетов. Если сокет-сервер ждет ответа, то по таймеру его ожидание уже никак нельзя прервать и отправить в его выходной поток информацию?
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311347
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12Честно говоря, с прокси очень плохо знаком (в смысле программирования).

Это не паттерн proxy, а network proxy.
TCP прокси это такая программа, которая получает TCP соединение от клиента, затем соединяется с другим TCP сервером. И гоняет туда-сюда данные. Ваша программа это адаптер между каким-то клиентом и каким-то сервером. Т.е. это тот же TCP Proxy, только он данные дополнительно преобразовывает.

else12А чем простые сокеты не подходят?

Тем что готовое решение, возможно, уже реализует весь транспорт за вас. Вам только остаётся допистаь логику конвертации.

else12Единственное, что не очень понял насчет "блокирующих" - "не блокирующих" сокетов. Если сокет-сервер ждет ответа, то по таймеру его ожидание уже никак нельзя прервать и отправить в его выходной поток информацию?
Под блокировкой здесь понимается Thread, который читает\пишет данные. Блокирующие алгоритмы заставляют потоки ждать, окончания записи, или поступления нового пакета при чтении.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311364
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема с блокирующими сокетами еще и в том, что если сервер кроме ответов клиенту может отправлять сам ему какие-то "оповещения", то может возникнуть ситуация, когда клиент, начавший запрос, может получить не ответ на него, а отправленное перед ответом уведомление (хотя это конечно можно конфликт можно разрешить, но придется городить костыли, которые будут это все разрешать). С неблокирующими сокетами такого не будет т.к. вы сами должны будете реализовывать логику отправил запрос/получил ответ.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311366
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczTCP прокси это такая программа, которая получает TCP соединение от клиента, затем соединяется с другим TCP сервером. И гоняет туда-сюда данные. Ваша программа это адаптер между каким-то клиентом и каким-то сервером. Т.е. это тот же TCP Proxy, только он данные дополнительно преобразовывает.
Эх, а не сложно ли в нем разбираться? Хотя, можно попробовать - просто я в общих чертах-то представляю сейчас решение задачи на сокетах(в деталях, конечно, хуже представляю), а вот прокси не знаю вообще...

BlazkowiczПод блокировкой здесь понимается Thread, который читает\пишет данные. Блокирующие алгоритмы заставляют потоки ждать, окончания записи, или поступления нового пакета при чтении.
Я чего-то подумал - не усложняю ли я... В принципе я получаю команду из сокета А, обрабатываю, отправляю в Б, получаю ответ, отправляю его в сокет А. В это время может произойти только задержка по времени. Вот в ней у меня загвоздка. И еще загвоздка в посылке сообщения об ошибке из сокета Б в сокет А.

Так-то я просто жду сигнала в А и далее гоняю данные по цепочке. А вот внештатные ситуации... Я не очень понял - как мне здесь помешает поток?
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311381
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12. В принципе я получаю команду из сокета А, обрабатываю, отправляю в Б
насколько знаю сокеты - не так.
Цикл событий:
- таймер каждые 15 миллисекунд на чтение СокетаА и ПОСЛЕ него СокетаБ
- событие по записи возникает только если Пришло что-то на чтение выше.
- Если пришло, то сразу распарсить, конвертнуть, опреелить ошибку и ОТПРАВИТЬ тут же
Итого 1 поток.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311389
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
при одном потоке блокировок не бывает. Может просесть время передачи при большой нагрузке.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311394
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwaПроблема с блокирующими сокетами еще и в том, что если сервер кроме ответов клиенту может отправлять сам ему какие-то "оповещения", то может возникнуть ситуация, когда клиент, начавший запрос, может получить не ответ на него, а отправленное перед ответом уведомление (хотя это конечно можно конфликт можно разрешить, но придется городить костыли, которые будут это все разрешать). С неблокирующими сокетами такого не будет т.к. вы сами должны будете реализовывать логику отправил запрос/получил ответ.
А я и реализую такую логику. Я не отслеживаю правильность ответа как такового и оповещения посылаю сам (если просрочено время). Вместо ответа на запрос из А в Б, от Б может придти только сообщение об ошибке.

Иногда оно генерируется не как ответ на запрос, а само по себе - вот этот случай для меня пока не понятен. Сервер-сокет А ждет сообщения из сокета, а ему должна придти информация от сокета Б, то есть из режима accept он должен как-то выйти и я ему в выходной поток должен отправить сообщение об ошибке. Как это сделать, я не очень понял...
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311408
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12Как это сделать, я не очень понял...
если там 30 страниц, то просто отправь ему и всё.
Он сам переключается на запись и чтение.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311412
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123else12Как это сделать, я не очень понял...
если там 30 страниц, то просто отправь ему и всё.
Он сам переключается на запись и чтение.
А как это сделать в одном потоке? То есть получается все же нужны два потока - один на обработку сокета А, второй - сокета Б?
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311424
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12А как это сделать в одном потоке? То есть получается все же нужны два потока - один на обработку сокета А, второй - сокета Б?
2 на запись, 2 на чтение - full duplex.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311425
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12А как это сделать в одном потоке?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  Execute по таймеру или постоянно
{
  // Слушаем порт
  if SocetA.ReadText(sInBuffer) then // 
  {
  //пришло, читаем и отправляем в СокетБ
  }
  if SocetB.ReadText(sInBuffer) then // 
  {
  //пришло, читаем и отправляем в СокетА
  }
  
}
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311432
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12,
у меня проект с ...много приборов, поэтому - потоки.
Тогда как один ПриборА ждёт ответа - секунды. А я отвечаю за доли секунды.
Поэтому тебе решать.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311439
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123else12А как это сделать в одном потоке?
Execute по таймеру или постоянно

Чего-то стал путаться... В сокете А у меня сервер, там accept. А сокете Б - клиент, там все просто. Я так понимаю, что, если делать постоянное прослушивание сокета, то надо делать бесконечный цикл: прослушивание сокета, считывание ответа и отправка данных в выходной поток. А как иначе, без таймера и без цикла можно сделать?
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311465
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12Petro123пропущено...
Execute по таймеру или постоянно

Чего-то стал путаться... В сокете А у меня сервер, там accept. А сокете Б - клиент, там все просто. Я так понимаю, что, если делать постоянное прослушивание сокета, то надо делать бесконечный цикл: прослушивание сокета, считывание ответа и отправка данных в выходной поток. А как иначе, без таймера и без цикла можно сделать?
это самый простой вариант хоть на блокируещем сокете, т.к. у тебя 2 клиента и между ними прокси.

Да. Либо ты сам или библиотека городит события Что-То-пришло. Либо ты в 1 потоке постоянно слушаешь сокетПрибораА и СокетПрибораБ на сообщения.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311469
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. в Execute у тебя только БЛ.
В SocetA - объект который примет весь пакет сообщения с маркерами конца и начала.
Поток на данной строке подвиснет на часть секунды.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311477
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123т.е. в Execute у тебя только БЛ.
А БЛ это что?
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311493
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12,
бизнес логика.
...Если время просрочили, то отправить
Код: java
1.
SocetA.Write('<XML>Клиент отвался</XML>'
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311512
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123т.е. в Execute у тебя только БЛ.
В SocetA - объект который примет весь пакет сообщения с маркерами конца и начала.
Поток на данной строке подвиснет на часть секунды.
Так. Ну, мне надо все понять, а я туповат. Поэтому и буду задавать туповатые вопросы

Значит, в SocetA - accept, считывание входного потока и конвертация? В SocetВ - прослушивание потока Б, считывание входного потока, конвертация для потока А?

Или я все не правильно понял? А execute - это что в данном контексте?
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311533
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12,
1. Читает в цикле из сокета всё что есть пока не кончится поток (прочитано 0 байт).
Конвертация зачем? Выдать в выходной параметр в виде строки-перемененой. Там псевдо код с выходной переменной Out
2. execute это просто имя процедуры. Назови её - ПостоянноМолотитьЧитать{}
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311562
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro1231. Читает в цикле из сокета всё что есть пока не кончится поток (прочитано 0 байт).
Я так понял, что речь идет о процедуре ReadText?

Petro123Конвертация зачем? Выдать в выходной параметр в виде строки-перемененой. Там псевдо код с выходной переменной Out
У меня входной поток сразу передается в Stax, где конвертится в строку для сокета Б. Но это не важно - смысл понятен.

Petro1232. execute это просто имя процедуры. Назови её - ПостоянноМолотитьЧитать{}
Т.е. она в цикле или по таймеру опрашивает сокет и читает оттуда?

ЗЫ Не совсем понятна синхронизация - я читаю данные из сокета А, затем в "БЛ" передаю данные в сокет Б. Из сокета Б я должен получить данные и выдать в А. А может и не быть передачи из Б в А - в этом случае программа зависнет на ожидании считывания из сокета Б?

И еще - не понятно как в данной логике сделать посылку из сокета Б в сокет А без запроса из А.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38311614
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12,
1. как угодно. Пусть в цикле читает. Это называется OnIdle (когда система не занята). В Java могут уточнить.
2. Если в сокете пусто, то ничего не виснет. Виснет если xml несколько мегов
3. Отправляешь сразу. Читаешь на след итерации цикла. Приведи пример по временной диаграмме.
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38312187
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro1231. как угодно. Пусть в цикле читает. Это называется OnIdle (когда система не занята). В Java могут уточнить.
Все-таки насчет ReadText я не врубился до конца. Если там будет чтение в цикле в одном потоке, то программа и зациклится на этом месте... По идее там должен быть просмотр сокета - есть ли что-то или нет, затем просмотр другого - есть ли там что-то. Но в случае сервера как сделать просмотр и пройти дальше? Он же на accept зависнет в ожидании? Или я что-то не так понимаю?
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38312395
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12,
Цикл пока есть байты сокете
Soket.ReadText
Если в буфере сокета пусто то выход из цикла.
Как он зависнет?
...
Рейтинг: 0 / 0
Как правильно написать общение объектов через сокеты?
    #38312404
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не знаю что там за объект сервер.
Я написал для случая когда ты Сам читаешь входной поток.
Тяжело тебе проверить 3 строки кода что ли?
...
Рейтинг: 0 / 0
59 сообщений из 59, показаны все 3 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Как правильно написать общение объектов через сокеты?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]