|
|
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#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 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
Я бы все входящие сообщения складировал был в очередь. Или даже две очереди. А выделеными потоками (по одному на сокет) разгребал очередь и записывал в сокеты. Проверять время можно по той же очереди. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 14:15:35 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
Petro123else12то это воспринялось как ошибка кем воспринялось? Мною. Моим демоном-драйвером. Воспринялось как ошибка и передалось в сокет А. При этом, если ответ все же придет, но поздно, то его надо проигнорировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 14:16:28 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12Petro123пропущено... кем воспринялось? Мною. Моим демоном-драйвером. Воспринялось как ошибка и передалось в сокет А. При этом, если ответ все же придет, но поздно, то его надо проигнорировать. ТЫ - лишнее звено)))) Не возлагай на себя лишних полномочий))). Ты - конвертер. Если конечно, Прибор А сам умеет считать таймАут ответа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 14:19:11 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЯ бы все входящие сообщения складировал был в очередь. Или даже две очереди. А выделеными потоками (по одному на сокет) разгребал очередь и записывал в сокеты. Проверять время можно по той же очереди. Тут важна скорость, т.к. "не ответ" в течение какого-то времени должен расцениваться как ошибка - а складирование и потом разгребание - это все же время. Кстати, а "очередь" в данном контексте это будет что конкретно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 14:21:22 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
Petro123else12пропущено... Мною. Моим демоном-драйвером. Воспринялось как ошибка и передалось в сокет А. При этом, если ответ все же придет, но поздно, то его надо проигнорировать. ТЫ - лишнее звено)))) Не возлагай на себя лишних полномочий))). Ты - конвертер. Если конечно, Прибор А сам умеет считать таймАут ответа. Да я-то с удовольствием все полномочия скину, но у меня ТЗ, а в нем написано, что таймаут ответа как раз я должен считать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 14:23:00 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12Тут важна скорость, т.к. "не ответ" в течение какого-то времени должен расцениваться как ошибка - а складирование и потом разгребание - это все же время. Положить ссылку на объект в коллекцию это просто уйма времени. Смысл в том, что запись в сокеты вам всё равно надо как-то синхронизировать. И тормозить оно начнет в первую очередь тогда, когда вы начнете куда-попало synchronized пихать. else12Кстати, а "очередь" в данном контексте это будет что конкретно? Если нужна скорость, то какую-нибудь реализацию java.util.Queue (см ExecutorService, Executors) - http://docs.oracle.com/javase/tutorial/essential/concurrency/exinter.html Если нужны транзакционность и сохранение данных, то какое-нибудь легковесное NoSQL хранилище. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 14:28:18 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
rfqДля начала нарисуйте картинку - как от объекта к объекту у вас движутся сообщения (включая сигналы таймера). Типа таких, которые подсказывает гугл "картинки по запросу data flow" на Data flow diagram . Теперь картинку надо формализировать: везде поставить стрелки, и выписать условие прохождения сообщений через узлы. Типичные условия: узел одновременно обрабатывает не более одного сообщения, узел начинает обработку когда сообщения пришли на все входы, после обработки сообщения удаляются со входов и пересылаются дальше и т.п. Наиболее близкая и понятная математическая модель - сети Петри , но надо избегать ситуаций, когда из одной позиции идут стрелки на несколько переходов - эти ситуации трудно реализуются. Собственно это и будет синхронизация. Останется эту картинку реализовать, но это другой вопрос. Когда покажете картинку, вым сразу подскажут. Я боюсь, что про сети Петри я помню только то, что я их когда-то, очень давно, изучал, но забыл напрочь, то есть абсолютно... А словесно схему я, вроде как, обрисовал... Или как-то "не очень" обрисовал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 14:28:41 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczelse12Тут важна скорость, т.к. "не ответ" в течение какого-то времени должен расцениваться как ошибка - а складирование и потом разгребание - это все же время. Положить ссылку на объект в коллекцию это просто уйма времени. Смысл в том, что запись в сокеты вам всё равно надо как-то синхронизировать. И тормозить оно начнет в первую очередь тогда, когда вы начнете куда-попало synchronized пихать. else12Кстати, а "очередь" в данном контексте это будет что конкретно? Если нужна скорость, то какую-нибудь реализацию java.util.Queue (см ExecutorService, Executors) - http://docs.oracle.com/javase/tutorial/essential/concurrency/exinter.html Если нужны транзакционность и сохранение данных, то какое-нибудь легковесное NoSQL хранилище. Аааа... А то у меня уже начал в мозгу реализовываться сложный механизм очередей... Если это просто коллекции и т.п., то еще ладно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 14:32:00 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12Или как-то "не очень" обрисовал? Ну, так... Может взять какой-то готовый Proxy и дописать в него нужную логику? http://grinder.sourceforge.net/g3/tcpproxy.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 14:33:30 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12Да я-то с удовольствием все полномочия скину, но у меня ТЗ, а в нем написано, что таймаут ответа как раз я должен считать... ну тогда считай, раз не можешь уточнить зачем считать...и что делать если в А таймаут на ответ 5 сек. А в драйвере 10 сек. И наоборот. ... Если считать, то Код: java 1. 2. - Отнять и посчитать сможешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 14:41:12 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczelse12Или как-то "не очень" обрисовал? Ну, так... Может взять какой-то готовый Proxy и дописать в него нужную логику? http://grinder.sourceforge.net/g3/tcpproxy.html Честно говоря, с прокси очень плохо знаком (в смысле программирования). А чем простые сокеты не подходят? Единственное, что не очень понял насчет "блокирующих" - "не блокирующих" сокетов. Если сокет-сервер ждет ответа, то по таймеру его ожидание уже никак нельзя прервать и отправить в его выходной поток информацию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 14:43:53 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12Честно говоря, с прокси очень плохо знаком (в смысле программирования). Это не паттерн proxy, а network proxy. TCP прокси это такая программа, которая получает TCP соединение от клиента, затем соединяется с другим TCP сервером. И гоняет туда-сюда данные. Ваша программа это адаптер между каким-то клиентом и каким-то сервером. Т.е. это тот же TCP Proxy, только он данные дополнительно преобразовывает. else12А чем простые сокеты не подходят? Тем что готовое решение, возможно, уже реализует весь транспорт за вас. Вам только остаётся допистаь логику конвертации. else12Единственное, что не очень понял насчет "блокирующих" - "не блокирующих" сокетов. Если сокет-сервер ждет ответа, то по таймеру его ожидание уже никак нельзя прервать и отправить в его выходной поток информацию? Под блокировкой здесь понимается Thread, который читает\пишет данные. Блокирующие алгоритмы заставляют потоки ждать, окончания записи, или поступления нового пакета при чтении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 14:52:29 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
Проблема с блокирующими сокетами еще и в том, что если сервер кроме ответов клиенту может отправлять сам ему какие-то "оповещения", то может возникнуть ситуация, когда клиент, начавший запрос, может получить не ответ на него, а отправленное перед ответом уведомление (хотя это конечно можно конфликт можно разрешить, но придется городить костыли, которые будут это все разрешать). С неблокирующими сокетами такого не будет т.к. вы сами должны будете реализовывать логику отправил запрос/получил ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 15:01:52 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczTCP прокси это такая программа, которая получает TCP соединение от клиента, затем соединяется с другим TCP сервером. И гоняет туда-сюда данные. Ваша программа это адаптер между каким-то клиентом и каким-то сервером. Т.е. это тот же TCP Proxy, только он данные дополнительно преобразовывает. Эх, а не сложно ли в нем разбираться? Хотя, можно попробовать - просто я в общих чертах-то представляю сейчас решение задачи на сокетах(в деталях, конечно, хуже представляю), а вот прокси не знаю вообще... BlazkowiczПод блокировкой здесь понимается Thread, который читает\пишет данные. Блокирующие алгоритмы заставляют потоки ждать, окончания записи, или поступления нового пакета при чтении. Я чего-то подумал - не усложняю ли я... В принципе я получаю команду из сокета А, обрабатываю, отправляю в Б, получаю ответ, отправляю его в сокет А. В это время может произойти только задержка по времени. Вот в ней у меня загвоздка. И еще загвоздка в посылке сообщения об ошибке из сокета Б в сокет А. Так-то я просто жду сигнала в А и далее гоняю данные по цепочке. А вот внештатные ситуации... Я не очень понял - как мне здесь помешает поток? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 15:02:12 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12. В принципе я получаю команду из сокета А, обрабатываю, отправляю в Б насколько знаю сокеты - не так. Цикл событий: - таймер каждые 15 миллисекунд на чтение СокетаА и ПОСЛЕ него СокетаБ - событие по записи возникает только если Пришло что-то на чтение выше. - Если пришло, то сразу распарсить, конвертнуть, опреелить ошибку и ОТПРАВИТЬ тут же Итого 1 поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 15:07:54 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
при одном потоке блокировок не бывает. Может просесть время передачи при большой нагрузке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 15:10:21 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
schwaПроблема с блокирующими сокетами еще и в том, что если сервер кроме ответов клиенту может отправлять сам ему какие-то "оповещения", то может возникнуть ситуация, когда клиент, начавший запрос, может получить не ответ на него, а отправленное перед ответом уведомление (хотя это конечно можно конфликт можно разрешить, но придется городить костыли, которые будут это все разрешать). С неблокирующими сокетами такого не будет т.к. вы сами должны будете реализовывать логику отправил запрос/получил ответ. А я и реализую такую логику. Я не отслеживаю правильность ответа как такового и оповещения посылаю сам (если просрочено время). Вместо ответа на запрос из А в Б, от Б может придти только сообщение об ошибке. Иногда оно генерируется не как ответ на запрос, а само по себе - вот этот случай для меня пока не понятен. Сервер-сокет А ждет сообщения из сокета, а ему должна придти информация от сокета Б, то есть из режима accept он должен как-то выйти и я ему в выходной поток должен отправить сообщение об ошибке. Как это сделать, я не очень понял... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 15:11:20 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12Как это сделать, я не очень понял... если там 30 страниц, то просто отправь ему и всё. Он сам переключается на запись и чтение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 15:17:15 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
Petro123else12Как это сделать, я не очень понял... если там 30 страниц, то просто отправь ему и всё. Он сам переключается на запись и чтение. А как это сделать в одном потоке? То есть получается все же нужны два потока - один на обработку сокета А, второй - сокета Б? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 15:20:58 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12А как это сделать в одном потоке? То есть получается все же нужны два потока - один на обработку сокета А, второй - сокета Б? 2 на запись, 2 на чтение - full duplex. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 15:26:42 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12А как это сделать в одном потоке? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 15:26:46 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12, у меня проект с ...много приборов, поэтому - потоки. Тогда как один ПриборА ждёт ответа - секунды. А я отвечаю за доли секунды. Поэтому тебе решать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 15:30:50 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
Petro123else12А как это сделать в одном потоке? Execute по таймеру или постоянно Чего-то стал путаться... В сокете А у меня сервер, там accept. А сокете Б - клиент, там все просто. Я так понимаю, что, если делать постоянное прослушивание сокета, то надо делать бесконечный цикл: прослушивание сокета, считывание ответа и отправка данных в выходной поток. А как иначе, без таймера и без цикла можно сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 15:35:31 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12Petro123пропущено... Execute по таймеру или постоянно Чего-то стал путаться... В сокете А у меня сервер, там accept. А сокете Б - клиент, там все просто. Я так понимаю, что, если делать постоянное прослушивание сокета, то надо делать бесконечный цикл: прослушивание сокета, считывание ответа и отправка данных в выходной поток. А как иначе, без таймера и без цикла можно сделать? это самый простой вариант хоть на блокируещем сокете, т.к. у тебя 2 клиента и между ними прокси. Да. Либо ты сам или библиотека городит события Что-То-пришло. Либо ты в 1 потоке постоянно слушаешь сокетПрибораА и СокетПрибораБ на сообщения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 15:48:39 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
т.е. в Execute у тебя только БЛ. В SocetA - объект который примет весь пакет сообщения с маркерами конца и начала. Поток на данной строке подвиснет на часть секунды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 15:50:33 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
Petro123т.е. в Execute у тебя только БЛ. А БЛ это что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 15:54:15 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12, бизнес логика. ...Если время просрочили, то отправить Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 16:00:49 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
Petro123т.е. в Execute у тебя только БЛ. В SocetA - объект который примет весь пакет сообщения с маркерами конца и начала. Поток на данной строке подвиснет на часть секунды. Так. Ну, мне надо все понять, а я туповат. Поэтому и буду задавать туповатые вопросы Значит, в SocetA - accept, считывание входного потока и конвертация? В SocetВ - прослушивание потока Б, считывание входного потока, конвертация для потока А? Или я все не правильно понял? А execute - это что в данном контексте? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 16:08:23 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12, 1. Читает в цикле из сокета всё что есть пока не кончится поток (прочитано 0 байт). Конвертация зачем? Выдать в выходной параметр в виде строки-перемененой. Там псевдо код с выходной переменной Out 2. execute это просто имя процедуры. Назови её - ПостоянноМолотитьЧитать{} ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 16:14:01 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
Petro1231. Читает в цикле из сокета всё что есть пока не кончится поток (прочитано 0 байт). Я так понял, что речь идет о процедуре ReadText? Petro123Конвертация зачем? Выдать в выходной параметр в виде строки-перемененой. Там псевдо код с выходной переменной Out У меня входной поток сразу передается в Stax, где конвертится в строку для сокета Б. Но это не важно - смысл понятен. Petro1232. execute это просто имя процедуры. Назови её - ПостоянноМолотитьЧитать{} Т.е. она в цикле или по таймеру опрашивает сокет и читает оттуда? ЗЫ Не совсем понятна синхронизация - я читаю данные из сокета А, затем в "БЛ" передаю данные в сокет Б. Из сокета Б я должен получить данные и выдать в А. А может и не быть передачи из Б в А - в этом случае программа зависнет на ожидании считывания из сокета Б? И еще - не понятно как в данной логике сделать посылку из сокета Б в сокет А без запроса из А. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 16:27:23 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12, 1. как угодно. Пусть в цикле читает. Это называется OnIdle (когда система не занята). В Java могут уточнить. 2. Если в сокете пусто, то ничего не виснет. Виснет если xml несколько мегов 3. Отправляешь сразу. Читаешь на след итерации цикла. Приведи пример по временной диаграмме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2013, 16:45:22 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
Petro1231. как угодно. Пусть в цикле читает. Это называется OnIdle (когда система не занята). В Java могут уточнить. Все-таки насчет ReadText я не врубился до конца. Если там будет чтение в цикле в одном потоке, то программа и зациклится на этом месте... По идее там должен быть просмотр сокета - есть ли что-то или нет, затем просмотр другого - есть ли там что-то. Но в случае сервера как сделать просмотр и пройти дальше? Он же на accept зависнет в ожидании? Или я что-то не так понимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2013, 10:08:23 |
|
||
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#18+
else12, Цикл пока есть байты сокете Soket.ReadText Если в буфере сокета пусто то выход из цикла. Как он зависнет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2013, 12:24:23 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2129094]: |
0ms |
get settings: |
12ms |
get forum list: |
26ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
79ms |
get topic data: |
21ms |
get forum data: |
5ms |
get page messages: |
127ms |
get tp. blocked users: |
3ms |
| others: | 289ms |
| total: | 576ms |

| 0 / 0 |
