|
|
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
Задача у меня такая: Я получаю от объекта 1 через сокет А команду (у меня там сокет-сервер), ее конвертирую в нужный формат и отправляю через сокет Б(клиент) объекту 2. Возможны следующие ситуации: 1) Каноническая: принимаю команду через сокет А, конверчу, отправляю в сокет Б 2) То же самое, но должен дождаться ответа из сокета Б и передать ответ через сокет А объекту 1. Если ответа в течение определенного времени не получено, передаю в сокет А сообщение об ошибке 3) Иногда ситуация обратная: приходит команда из сокета Б и ее нужно сконвертировать и отправить в сокет А У меня опыта работы с сокетами мало и потому я запутался. Короче, как правильные джависты такие случаи программируют? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 11:19:02 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
Нужно решить два вопроса. Протокол транспорта TCP, HTTP что-то ещё? Протокол сериализации Java, protobuf, JSON и т.д. TCP + Java сериализация это RMI. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 11:42:22 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 11:42:41 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12, автор дождаться ответа - это не Java, а БЛ - Связь Мастер-Мастер (двунаправленная) или Мастер --> Клиент (однонаправленная) - всё таки - "Ответ" или просто "сообщение в обратную сторону"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 11:45:11 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
Petro123всё таки - "Ответ" или просто "сообщение в обратную сторону"? В сторону А-> Б посылается либо команда, либо запрос. В обратную сторону посылается либо ответ на запрос, либо, например, сообщение об ошибке. Иногда сообщение об ошибке может возникать само по себе, не привязанное к запросу. Т.е. из Б в А посылается просто сообщение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 12:00:16 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНужно решить два вопроса. Протокол транспорта TCP, HTTP что-то ещё? Протокол сериализации Java, protobuf, JSON и т.д. TCP + Java сериализация это RMI. Протокол транспорта TCP , а "команда" - это xml-последовательность в сторону ( А->Б ) и что-то типа текстовой строки с разделителями в обратную сторону. Чисто-конкретно десктопное приложение - на одном сокете сервер (общение с объектом 1), на другом (общение с объектом 2)- клиент. Объекты 1 и 2 - там не мои программы, я просто обеспечиваю их взаимодействие... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 12:05:55 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
Так в чем проблема? Сделайте RMI обертку. Зачем какой-то XML гонять? Если и там и там Java, то почему бы не передавать сразу объекты. Даже если остро нужен XML, то лучше использовать XML сериализацию, а XML API. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 12:14:26 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczТак в чем проблема? Сделайте RMI обертку. Зачем какой-то XML гонять? Если и там и там Java, то почему бы не передавать сразу объекты. Даже если остро нужен XML, то лучше использовать XML сериализацию, а XML API. Нет, "там" и "там" как раз не джава. Объект 1 - это некий иноземный прибор, который по TCP через сокет шлет xml-команды, которые я должен принять, переконвертировать и переправить через сокет Б объекту 2, который также для меня внешний, и написан не на джаве. Мне даются два протокола обмена (с одной стороны xml-команды, c другой - текст с разделителями.) Я должен принять, переконвертировать, отдать, иногда дождаться ответа и передать его. А иногда - просто передать сообщения в обратную сторону, не инициированные запросом со стороны объекта 1. Я запутался как лучше это сделать - и в плане разнопоточности и в плане взаимодействия и синхронизации действий. Синхронизацию потоков как таковую я представляю, а как вот правильно все организовать в моем конкретном случае - не представляю... Ну, по простому туплю чего-то... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 12:29:57 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12Нет, "там" и "там" как раз не джава. Объект 1 - это некий иноземный прибор, который по TCP через сокет шлет xml-команды, которые я должен принять, переконвертировать и переправить через сокет Б объекту 2, который также для меня внешний, и написан не на джаве. Мне даются два протокола обмена (с одной стороны xml-команды, c другой - текст с разделителями.) Я должен принять, переконвертировать, отдать, иногда дождаться ответа и передать его. А иногда - просто передать сообщения в обратную сторону, не инициированные запросом со стороны объекта 1. Я запутался как лучше это сделать - и в плане разнопоточности и в плане взаимодействия и синхронизации действий. Синхронизацию потоков как таковую я представляю, а как вот правильно все организовать в моем конкретном случае - не представляю... Ну, по простому туплю чего-то... Ну, вот. Хоть какая-то конкретника. "Разнопоточность". 8) А что за два сокета тогда??? Есть девайс, он работает с сервером? И есть GUI, который работает с тем же сервером? Так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 12:37:22 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12, если это девайс, тогда он должен иметь протокол более высокого уровня. Либо тогда к девайсу цепляется драйвер на другом ЯП для трансляции Прибор+драйвер-транслятор ----> внешние системы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 12:43:04 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12Если ответа в течение определенного времени не получено, передаю в сокет А сообщение об ошибке не бойся выложить ПРОТОКОЛ работы чужлго прибора1. Там должен быть тайм-аут ожидания ответа. А также вероятно технические пинги-команды для подтверждения коннекта. - может ли быть несколько приборов или клиентов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 12:48:54 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else121) Каноническая: принимаю команду через сокет А, конверчу, отправляю в сокет Б 2) То же самое, но должен дождаться ответа из сокета Б и передать ответ через сокет А объекту 1. Если ответа в течение определенного времени не получено, передаю в сокет А сообщение об ошибке 3) Иногда ситуация обратная: приходит команда из сокета Б и ее нужно сконвертировать и отправить в сокет А в принципе, так бери и пиши: - модуль получения XML (тут было) - модуль конвертации XML в КомандаА (шаблон Команда для крутости) - модуль-переменная хранения состояния для запроса-таймаута - .... Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 12:56:37 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
Petro123Прибор+драйвер-транслятор ----> внешние системы Да, оно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 12:59:46 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12Petro123Прибор+драйвер-транслятор ----> внешние системы Да, оно. т.к. у тебя вся работа по факту Драйвер на сокетах. Java не лучший ЯП для этого. Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 13:01:04 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
Petro123не бойся выложить ПРОТОКОЛ работы чужлго прибора1. Там страниц эдак на 30-40... Petro123Там должен быть тайм-аут ожидания ответа. А также вероятно технические пинги-команды для подтверждения коннекта. - может ли быть несколько приборов или клиентов? Эт как? Прибор - он внешний. А мой "драйвер-конвертор" - это по сути демон на компьютере. В сокет этому компьютеру приходят команды, в другой сокет уходят преобразованные в другой формат те же команды... Один "прибор" со стороны 1 и другой - со стороны 2. Petro123в принципе, так бери и пиши: - модуль получения XML (тут было) - уже написал - модуль конвертации XML в КомандаА (шаблон Команда для крутости) - уже написал - модуль-переменная хранения состояния для запроса-таймаута - а вот тут я и запнулся - как эту всю лабуду синхронизировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 13:06:09 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНу, вот. Хоть какая-то конкретника. "Разнопоточность". 8) А что за два сокета тогда??? Есть девайс, он работает с сервером? И есть GUI, который работает с тем же сервером? Так? Собственно, уже описал схему. ГУИ там нет, это что-то типа демона-драйвера -конвертора. "Сервер" - я имел в виду сокет, через который я принимаю команду от объекта 1 - сервер с моей стороны по отношению к объекту 1. А отправляю команду на объект 2 и принимаю оттуда ответ - через сокет, который "клиент" по отношению к объекту 2. Так мне поставлена задача... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 13:10:33 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
Petro123т.к. у тебя вся работа по факту Драйвер на сокетах. Java не лучший ЯП для этого. Удачи! Собственно, не принципиально. Какая разница. Я с++ знаю хуже, поэтому и пишу на джаве (остальные знакомые языки не кросс-платформенны). Главное, чтобы работала. Проблема в том, что не соображу как все правильно синхронизировать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 13:21:40 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12Собственно, уже описал схему. ГУИ там нет, это что-то типа демона-драйвера -конвертора. "Сервер" - я имел в виду сокет, через который я принимаю команду от объекта 1 - сервер с моей стороны по отношению к объекту 1. А отправляю команду на объект 2 и принимаю оттуда ответ - через сокет, который "клиент" по отношению к объекту 2. Так мне поставлена задача... "объект" это экземпляр класса. Удаленная сторона, обычно называется tier. Чем больше вы используете термины не по назначению, тем сложнее вас понять. У вас один сокет серверный, а второй клиентский? Т.е. серверный может получать данные из разных источников, а клиентский может получать\отправлять только синхронно? Так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 13:33:20 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12- модуль-переменная хранения состояния для запроса-таймаута - а вот тут я и запнулся - как эту всю лабуду синхронизировать? - я вас спрашивал - надо ли по протколу пинговать? Если нет, то проще. Приведи пример, какую ошибку надо отправить при отсутствии ответа Б-А. Почему нельзя САМОМУ А реагировать на отсутствие ответа Б-А? Тогда тебя посередине НИЧЕГО не будет волновать - получил - передал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 13:46:57 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
Если между клиентом и сервером не просто запрос-ответ, а запрос-ответ + какие-то уведомления от сервера, то нужно брать сокеты из nio ( http://docs.oracle.com/javase/7/docs/api/java/nio/channels/package-summary.html), а лучше какую-нибудь обертку на ними ( http://netty.io/). Для такого сценария на блокирующие сокеты лучше даже сразу не смотреть т.к. для такой схемы вы ничего кроме головной боли не получите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 13:52:32 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
schwa, если клиент один, то вроде блокировать некому.... Конечно, надо нагрузку на канал знать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 13:57:33 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12Petro123т.к. у тебя вся работа по факту Драйвер на сокетах. Java не лучший ЯП для этого. Удачи! Собственно, не принципиально. Какая разница. Я с++ знаю хуже, поэтому и пишу на джаве (остальные знакомые языки не кросс-платформенны). Главное, чтобы работала. Совершенно здравое рассуждение. Меньше слушайте критиканов (которые делают громкие заявления, не подкрепляя доказательствами). else12Проблема в том, что не соображу как все правильно синхронизировать... Для начала нарисуйте картинку - как от объекта к объекту у вас движутся сообщения (включая сигналы таймера). Типа таких, которые подсказывает гугл "картинки по запросу data flow" на Data flow diagram . Теперь картинку надо формализировать: везде поставить стрелки, и выписать условие прохождения сообщений через узлы. Типичные условия: узел одновременно обрабатывает не более одного сообщения, узел начинает обработку когда сообщения пришли на все входы, после обработки сообщения удаляются со входов и пересылаются дальше и т.п. Наиболее близкая и понятная математическая модель - сети Петри , но надо избегать ситуаций, когда из одной позиции идут стрелки на несколько переходов - эти ситуации трудно реализуются. Собственно это и будет синхронизация. Останется эту картинку реализовать, но это другой вопрос. Когда покажете картинку, вым сразу подскажут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 14:00:26 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczУ вас один сокет серверный, а второй клиентский? Да BlazkowiczТ.е. серверный может получать данные из разных источников, а клиентский может получать\отправлять только синхронно? Так? Не совсем. Серверный является серверным только потому, что такие условия мне выкатили, а так он получает сигнал из одного источника. Клиентский (сокет Б) в основном работает в режиме "получил информацию -> переправил в выходной поток -> получил ответ -> передал для передачи в сокет А" Иногда клиентский сокет получает ответ безо всякого запроса. При этом надо отследить, чтобы, если долго нет ответа (заданное число милисекунд), то это воспринялось как ошибка даже в случае, если информация запоздало придет. Собственно, вот... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 14:09:57 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12то это воспринялось как ошибка кем воспринялось? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 14:12:23 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
Petro123 я вас спрашивал - надо ли по протколу пинговать? Если нет, то проще. Не надо. Petro123Приведи пример, какую ошибку надо отправить при отсутствии ответа Б-А. Обычный простейший xml с тегами <Error>, <ErrorCode> Petro123Почему нельзя САМОМУ А реагировать на отсутствие ответа Б-А? Тогда тебя посередине НИЧЕГО не будет волновать - получил - передал. Тут условия заданы поставщиком оборудования - реагируем мы, а не он. Он ,скотина такая, просто ждет и потом реагирует на наш ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 14:13:55 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38310906&tid=2129094]: |
0ms |
get settings: |
15ms |
get forum list: |
24ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
55ms |
get topic data: |
15ms |
get forum data: |
4ms |
get page messages: |
98ms |
get tp. blocked users: |
2ms |
| others: | 298ms |
| total: | 523ms |

| 0 / 0 |
