|
|
|
Как правильно написать общение объектов через сокеты?
|
|||
|---|---|---|---|
|
#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 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38311366&tid=2129094]: |
0ms |
get settings: |
19ms |
get forum list: |
22ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
41ms |
get topic data: |
18ms |
get forum data: |
4ms |
get page messages: |
106ms |
get tp. blocked users: |
3ms |
| others: | 333ms |
| total: | 558ms |

| 0 / 0 |
