Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Socket запись в блокирующем режиме.  [new]
Mandarin
Member

Откуда: Саратов
Сообщений: 1191
Всем привет! Подскажите пожалуйста как решить следующую задачу.
Есть два блокирующих сокета, один пишет socket.getOutputsream().write() второй читает socket.getInputStream().read()
Интернет между компьютерами медленный, данные передаются медленно. Буферы у советов большие.
Когда я вызываю write(), я жду что управление вернётся только тогда, когда данные будут отправлены, но управление возвращается раньше. Я пробовал делать flush() после write(), ситуация не поменялась. Как сделать так, чтобы управление возвращалось только после того, как данные отправятся?
19 май 20, 11:24    [22135609]     Ответить | Цитировать Сообщить модератору
 Re: Socket запись в блокирующем режиме.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4832
Mandarin,
Покажите код с блокирующим методом который НЕ РАБОТАЕТ по вашему.
19 май 20, 11:32    [22135612]     Ответить | Цитировать Сообщить модератору
 Re: Socket запись в блокирующем режиме.  [new]
Mandarin
Member

Откуда: Саратов
Сообщений: 1191
PetroNotC Sharp,

Вашими советами я уже сыт из предыдущего своего топика, спасибо :)
19 май 20, 11:38    [22135619]     Ответить | Цитировать Сообщить модератору
 Re: Socket запись в блокирующем режиме.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4832
Mandarin,
Привыкай ходить в общественное место где твои вопросы по java стоят ноль без палочки.
Видно же что ты джун 16 лет.
Тогда что выпендриваешься?
19 май 20, 11:44    [22135623]     Ответить | Цитировать Сообщить модератору
 Re: Socket запись в блокирующем режиме.  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10171
Mandarin
Когда я вызываю write(), я жду что управление вернётся только тогда, когда данные будут отправлены, но управление возвращается ...
... когда данные переданы IP-стеку, который лучше вас разбирается, что и когда отправлять.
Хотите закрыть нечётное число своих косяков ещё одним - делайте flush().
19 май 20, 11:49    [22135629]     Ответить | Цитировать Сообщить модератору
 Re: Socket запись в блокирующем режиме.  [new]
mayton
Member

Откуда: loopback
Сообщений: 46531
Поскольку устный пересказ проблемы нам не выглядит убедительным, я-бы предложил
все-таки взять макет кода и на нем все это посмотреть. Надо посмотреть где стоит
flush. И возможно сделать tcpdump работающего приложения с тонким логгированием
всех событий с таймингами по милисекундам.

В данном случае Петро прав. Обсуждать можно только что-то материальное. Иначе
у нас - философская беседа выходит. Как говорил один финский перец - покажите
мне ваш чортов код...
19 май 20, 12:08    [22135654]     Ответить | Цитировать Сообщить модератору
 Re: Socket запись в блокирующем режиме.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50052
Basil A. Sidorov
делайте flush().

Что-то не помню его у IP-стэка...
19 май 20, 14:15    [22135796]     Ответить | Цитировать Сообщить модератору
 Re: Socket запись в блокирующем режиме.  [new]
mayton
Member

Откуда: loopback
Сообщений: 46531
Он есть в буферизирующих стримах. И если Мандарин обернул сокет этим буфером
то конечно надо беспокоиться о том что финал каждого сетевого месседжа
завершается флашем.
19 май 20, 14:17    [22135800]     Ответить | Цитировать Сообщить модератору
 Re: Socket запись в блокирующем режиме.  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10171
Dimitry Sibiryakov
Что-то не помню его у IP-стэка...
У стека - специальный флаг, обеспечивающий немедленную отправку всего, что "пока отложено".
На уровне библиотеки ввода-вывода управление этим флагом (если доступно) будет делать flush(), как и для любых других потоков.
19 май 20, 14:25    [22135810]     Ответить | Цитировать Сообщить модератору
 Re: Socket запись в блокирующем режиме.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8548
Свезь - процесс взаимноглюкавый

То, что где-то кто-то посчитал отправленным, на другом конце впосле может быть еще не принятым.

Факт отправки, что в стрим, что в стек ОС, что в провод - одно фиолетово. Отправили и отправили, дальше не наше дело. Если нужен факт, что клиент данные точно получил (и обработал), то это должно решаться какими-то другими средствами

IMHO
19 май 20, 14:38    [22135820]     Ответить | Цитировать Сообщить модератору
 Re: Socket запись в блокирующем режиме.  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3543
Mandarin
Как сделать так, чтобы управление возвращалось только после того, как данные отправятся?
Отправка в TCP асинхронная до тех пор пока хватает буфера в ядре. Хотите ожидать - отправляйте гигабайты.
19 май 20, 15:02    [22135853]     Ответить | Цитировать Сообщить модератору
 Re: Socket запись в блокирующем режиме.  [new]
mayton
Member

Откуда: loopback
Сообщений: 46531
По сути - технический спор на уровне что делать Мандарину?

- делать сигнальный протокол с коротким временем отклика (типа SNMP)
- делать stream-протокол с высокой пропускной способностью

Думаю что в топике недостаточно информации. Мандарин должен рассказать что у него поверх сокетов.
Rest? Передача файлов?

Что у него показывает netstat на обоих концах? Сколько retransmits? Сколько bad segments?

Короче какое качество соединения?
19 май 20, 15:11    [22135864]     Ответить | Цитировать Сообщить модератору
 Re: Socket запись в блокирующем режиме.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8548
Андрей Панфилов

Странное утверждение
"Не верю" ( C )
19 май 20, 15:11    [22135865]     Ответить | Цитировать Сообщить модератору
 Re: Socket запись в блокирующем режиме.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8548
mayton

в последнее время показывать код или пытаться воспроизвести проблему с помощью test-case - мовитон
так же как и человечиским языком объяснить, что же нужно

после прочтения слов "я пробовал делать flush() после write(), ситуация не поменялась"
тут же вспоминается "если вдруг открылся люк, не пугайтесь – это глюк"

IMHO
19 май 20, 15:16    [22135868]     Ответить | Цитировать Сообщить модератору
 Re: Socket запись в блокирующем режиме.  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10171
mayton
По сути - технический спор на уровне что делать Мандарину?
В исходной формулировке - flush().
Когда человек научится излагать проблему, а не собственное видЕние решения - можно будет поговорить и более предметно.
Хотя, скорее всего, (ему) просто лень аккуратно разбирать поток данных на отдельные сообщения.
19 май 20, 15:21    [22135873]     Ответить | Цитировать Сообщить модератору
 Re: Socket запись в блокирующем режиме.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4832
mayton
По сути - технический спор на уровне что делать Мандарину?

Если ТС молчит и не может ничего сказать по своей собственной теме?
Это форум не уважать.
19 май 20, 15:46    [22135890]     Ответить | Цитировать Сообщить модератору
 Re: Socket запись в блокирующем режиме.  [new]
mayton
Member

Откуда: loopback
Сообщений: 46531
Возможно не хочет палить контору. Package names обычно включают организацию.
19 май 20, 16:00    [22135896]     Ответить | Цитировать Сообщить модератору
 Re: Socket запись в блокирующем режиме.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4832
mayton
Возможно не хочет палить контору. Package names обычно включают организацию.

У него 6 тем по java и во всех он молчит)))))))
19 май 20, 16:09    [22135902]     Ответить | Цитировать Сообщить модератору
 Re: Socket запись в блокирующем режиме.  [new]
mayton
Member

Откуда: loopback
Сообщений: 46531
Просто он - Делфист.
19 май 20, 16:15    [22135909]     Ответить | Цитировать Сообщить модератору
 Re: Socket запись в блокирующем режиме.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4832
mayton адвокат.
Дельфи прогеры в сокет не пишут.
Есть протоколы более высокого уровня чтобы переслать xml или заявка.docx.
19 май 20, 16:47    [22135930]     Ответить | Цитировать Сообщить модератору
 Re: Socket запись в блокирующем режиме.  [new]
mayton
Member

Откуда: loopback
Сообщений: 46531
Да они - вообще кросавчеки. Читаешь их форумы. Тишь да гладь. Толи нет у них проблем.

Толи они вообще не решаются обсуждать системообразующие вещи. Всякие там SOLID, Design Patterns.

Даже завидую.
19 май 20, 17:23    [22135953]     Ответить | Цитировать Сообщить модератору
 Re: Socket запись в блокирующем режиме.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4832
mayton,
Дельфисты?
Я сам оттуда.
Это уникальный ЯП + либа визуальных компонентов vcl.
Не требуется ORM и спринг)))))) LOL

Сообщение было отредактировано: 19 май 20, 17:27
19 май 20, 17:28    [22135957]     Ответить | Цитировать Сообщить модератору
 Re: Socket запись в блокирующем режиме.  [new]
mayton
Member

Откуда: loopback
Сообщений: 46531
Либа опенсорцная? Вообще сколько там опенсорца?
19 май 20, 17:35    [22135961]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить