|
|
|
Два потока для input & output при работе с Java Socket
|
|||
|---|---|---|---|
|
#18+
Привет всем! Есть мысль создать два потока. Отдельно для работы с input и отдельно для работы с output. Сделать это для того, чтобы можно было обрабатывать независимо входящие сообщения и ответы на них. Практикуется ли такое в реальных проектах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 15:25 |
|
||
|
Два потока для input & output при работе с Java Socket
|
|||
|---|---|---|---|
|
#18+
jxcoderПрактикуется ли такое в реальных проектах? Нет, конечно же. Все через один Stream и пишут, и читают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 15:28 |
|
||
|
Два потока для input & output при работе с Java Socket
|
|||
|---|---|---|---|
|
#18+
BlazkowiczjxcoderПрактикуется ли такое в реальных проектах? Нет, конечно же. Все через один Stream и пишут, и читают. я говорю о Thread'ах. то есть типа вот так: Код: java 1. 2. Можете дать небольшой пример или как-то более полно раскрыть мысль? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 15:39 |
|
||
|
Два потока для input & output при работе с Java Socket
|
|||
|---|---|---|---|
|
#18+
jxcoderя говорю о Thread'ах. ;) jxcoderМожете дать небольшой пример или как-то более полно раскрыть мысль? Да, какой ещё пример. Нормальный подход, как для чтения. Нужен, ли отдельный поток на запись - вотпрос открытый. Если у вас буфер для записи есть, то все в него пишут, а один потом читает, то есть смысл. Если же у вас запись - событие не частое, то можно просто через synchronized метод пакеты слать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 15:44 |
|
||
|
Два потока для input & output при работе с Java Socket
|
|||
|---|---|---|---|
|
#18+
Возможно я решаю не те проблемы совсем) Мне нужно отправлять запросы на сервер через сокет. Сейчас у меня всё просто и тупо. Один клиент и один сервер. И клиент отправляет сообщение, читает ответ и снова отправляет ответ и снова читает новое сообщение и т.д. У меня возникла мысль, что можно добавить какой-нибудь uuid в каждый запрос и в отдельном потоке отсылать запросы а в отдельном потоке читать ответы. Потом по uuid находить какой запрос выполнен (пришёл ответ от сервера). Что можете сказать по этому поводу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 15:58 |
|
||
|
Два потока для input & output при работе с Java Socket
|
|||
|---|---|---|---|
|
#18+
jxcoder, Просто чтобы было? А то как-то слишком просто выходит без этого? Лучше бы тогда на селекторы переписали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 15:59 |
|
||
|
Два потока для input & output при работе с Java Socket
|
|||
|---|---|---|---|
|
#18+
Ну идея в том, чтобы выполнять запросы параллельно на сервере. То есть клиент шлет две команды, они с разной скоростью выполняются. И когда для них готов ответ, то сервер в сокет сообщает, что я такой-то по номеру запрос отработал. Вот результат. Идея в том, чтобы не ждать последовательно пока один запрос выполнится потом другой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 16:11 |
|
||
|
Два потока для input & output при работе с Java Socket
|
|||
|---|---|---|---|
|
#18+
Ну, если у клиентской части в этом есть необходимость, то да. Но я бы не возился с сокетами, а сразу смотрел HTTP/2 и gRPC. Там, скорее всего, это уже реализовано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 16:17 |
|
||
|
Два потока для input & output при работе с Java Socket
|
|||
|---|---|---|---|
|
#18+
Я вот только пока не понимаю как можно после такой смены архитектуры на клиенте сделать вызов блокирующим. То есть в идеале хочется чтобы клиентский код выглядел бы как обычный вызов метода и получение результата. Такое вообще возможно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 16:20 |
|
||
|
Два потока для input & output при работе с Java Socket
|
|||
|---|---|---|---|
|
#18+
jxcoderЯ вот только пока не понимаю как можно после такой смены архитектуры на клиенте сделать вызов блокирующим. То есть в идеале хочется чтобы клиентский код выглядел бы как обычный вызов метода и получение результата. Такое вообще возможно? Ой. Это вообще довольно большой и спорный вопрос. То есть у вас клиент уже многопоточный что вы так легко хотите блокировать? Например, если у вас UI, то блокировать основной поток, как бы, не очень хорошо. Посмотрите как работают Future, ExecutorService в JCU. Можно несколько разных вариантов рассмотреть. - Блокироваться на пуле сообщений от сервера. Будить все потоки, когда пришел любой ответ. Потоки проверяют наличие их ID. Если такового нет, то засыпают. - Можно хранить Map<ID, Thread> и будить поток, когда придёт сообщение по ID. В обоих случаях желательно предусмотреть Timeout. - Можно извратится и вместо блокировки потока прикрутить continuation. Но в Java внятной реализации для него нет. Тут надо бы смотреть на архитекуру клиента, потому как пока что не понятно как у вас устроена его многопоточность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 16:36 |
|
||
|
Два потока для input & output при работе с Java Socket
|
|||
|---|---|---|---|
|
#18+
jxcoder Код: java 1. 2. Можете дать небольшой пример или как-то более полно раскрыть мысль? совместную работу с input и output стримами через треды (если речь об этом) можно организовать используя java.io.PipedOutputStream (и input соответственно) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 19:07 |
|
||
|
Два потока для input & output при работе с Java Socket
|
|||
|---|---|---|---|
|
#18+
andmed, piped stream-ы имеют свои косяки и к теме вопроса вообще никаким боком не относятся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 21:38 |
|
||
|
Два потока для input & output при работе с Java Socket
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 21:44 |
|
||
|
Два потока для input & output при работе с Java Socket
|
|||
|---|---|---|---|
|
#18+
jxcoderМне нужно отправлять запросы на сервер через сокет. Сейчас у меня всё просто и тупо. Один клиент и один сервер. И клиент отправляет сообщение, читает ответ и снова отправляет ответ и снова читает новое сообщение и т.д. У меня возникла мысль, что можно добавить какой-нибудь uuid в каждый запрос и в отдельном потоке отсылать запросы а в отдельном потоке читать ответы. Потом по uuid находить какой запрос выполнен (пришёл ответ от сервера).посмотри как устроен протокол websocket. в нем можно отправлять из любого места запросы. сервер будет отвечать по готовности . и твой uuid как раз и сгодится чтоб "связять" ответ с запросом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 21:51 |
|
||
|
Два потока для input & output при работе с Java Socket
|
|||
|---|---|---|---|
|
#18+
Blazkowiczandmed, piped stream-ы имеют свои косяки и к теме вопроса вообще никаким боком не относятся. ну ок. мы организовали обработку картинок таким образом. на косяки пока не нарвались ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2017, 09:51 |
|
||
|
Два потока для input & output при работе с Java Socket
|
|||
|---|---|---|---|
|
#18+
andmedну ок. мы организовали обработку картинок таким образом. на косяки пока не нарвались Это объясняет какое отношение оно имеет к первоначальному вопросу. :) А если серьезно, я тут тоже попробовал на днях. Для экономии памяти. Оказалось, что проще тупо заюзать временные файлы, чем аккуратно обработать все закрытия и убедится что потоки не утекают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2017, 10:08 |
|
||
|
|

start [/forum/topic.php?fid=59&tid=2122836]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 360ms |

| 0 / 0 |
