|
|
|
Оптимизация?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Существует проблема с манипуляцией полученных данных, особенно если используется протокол TCP. Дело в том, что при отправке сразу нескольких пакетов данных (максимальный размер пакета TCP 8192 байта) происходит «склеивание» пакетов. То, что TCP склеивает данные в один поток, не всегда удобно. Во многих случаях пакеты, приходящие по сети, обрабатываются отдельно, поэтому и читать их из буфера желательно тоже по одному. Это просто сделать, если все пакеты имеют одинаковую длину. Но если пакеты имеют разную длину, принимающая сторона заранее не знает, сколько байт нужно прочитать из буфера, чтобы получить ровно один пакет и ни байта больше. Чтобы обойти эту ситуацию, в пакете можно предусмотреть обязательный заголовок фиксированной длины, одно из полей которого хранит длину пакета. В этом случае принимающая сторона может читать пакет по частям: сначала заголовок известной длины, а потом и тело пакета, размер которого стал известен благодаря заголовку. Но самым неудобным является то, что пакеты не только склеиваются, но и разбиваются на части. Принимающая сторона может получить пакет меньшего размера, чем отправленный. Это значит, что отправленный пакет был послан по частям, и на момент его чтения принимающей стороной ещё не все части были получены. В этом случае нужно повторить операцию чтения данных, пока не будет получено всё, что нужно. Вот мое решение, но можно ли как-то проще сделать? :) Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2013, 08:57:54 |
|
||
|
Оптимизация?
|
|||
|---|---|---|---|
|
#18+
GorloPavelВот мое решение, но можно ли как-то проще сделать? DataInput взять на одном конце (и использовать readFully). На другом, соответственно, DataOutput. Вашего кода не понял. У вас там NIO что ли, что не позволяет блокироваться? Зачем такие сложности? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2013, 09:37:49 |
|
||
|
Оптимизация?
|
|||
|---|---|---|---|
|
#18+
GorloPavel, Тебе уже говорили, tcp - потоковый протокол, там НЕТ пакетов. Ты должен сам буферизировать и собирать свои пакеты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2013, 09:45:25 |
|
||
|
Оптимизация?
|
|||
|---|---|---|---|
|
#18+
И соответственно, разбиение данных на части — тоже фундаментальное свойство tcp. От него тоже нельзя избавиться никак. И ты там что-то говорил про размер tcp пакета, такого понятия нет, не существует, tcp может передаваться пакетами низшего уровня даже разных размеров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2013, 09:52:51 |
|
||
|
Оптимизация?
|
|||
|---|---|---|---|
|
#18+
MasterZivGorloPavel, Тебе уже говорили, tcp - потоковый протокол, там НЕТ пакетов. Ты должен сам буферизировать и собирать свои пакеты. А там и сеть мои пакеты! 4 байта заголовок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2013, 10:46:48 |
|
||
|
Оптимизация?
|
|||
|---|---|---|---|
|
#18+
Как еще проще сделать? Сейчас пакеты такие: 4 байта заголовок(размер полезных данных), остальное полезные данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2013, 11:16:59 |
|
||
|
Оптимизация?
|
|||
|---|---|---|---|
|
#18+
maxkarGorloPavelВот мое решение, но можно ли как-то проще сделать? DataInput взять на одном конце (и использовать readFully). На другом, соответственно, DataOutput. Вашего кода не понял. У вас там NIO что ли, что не позволяет блокироваться? Зачем такие сложности? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Да это вообще решается еще проще :) Вы просто не поняли вопроса. Код: java 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2013, 11:20:29 |
|
||
|
Оптимизация?
|
|||
|---|---|---|---|
|
#18+
Пакет вида "длина данных, данные" - не очень хорошее решение, т.к. вы не можете начинать отправку, не узнав размер отправляемых данных. Начнёте делать конвейер - или вас проклянут или сами себя проклянёте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2013, 17:09:24 |
|
||
|
Оптимизация?
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovПакет вида "длина данных, данные" - не очень хорошее решение, т.к. вы не можете начинать отправку, не узнав размер отправляемых данных. Начнёте делать конвейер - или вас проклянут или сами себя проклянёте. Предложите решение лучше и что-бы не было недостатков описанных в первом посте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 08:07:31 |
|
||
|
Оптимизация?
|
|||
|---|---|---|---|
|
#18+
GorloPavelДа это вообще решается еще проще :) Вы просто не поняли вопроса. А, я вернуть res из метода забыл. Это вместо всего вашего кода с парой буферов и копированием данных (и еще оберкти по чтению/перекладыванию данных). Т.е. сначала читаем длину (readBytes(is, 4)), затем парсим длину и читаем данные (readBytes(is, totalBytes)). А затем байты передаем обработчику. В любом случае от парсинга вы не избавитесь. Но в pull-варианте (читать блоки нужных размеров) он гораздо проще для чтения/реализации, чем в push-варианте (когда данные в парсер кормятся извне по частям). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 09:48:22 |
|
||
|
Оптимизация?
|
|||
|---|---|---|---|
|
#18+
maxkarGorloPavelДа это вообще решается еще проще :) Вы просто не поняли вопроса. А, я вернуть res из метода забыл. Это вместо всего вашего кода с парой буферов и копированием данных (и еще оберкти по чтению/перекладыванию данных). Т.е. сначала читаем длину (readBytes(is, 4)), затем парсим длину и читаем данные (readBytes(is, totalBytes)). А затем байты передаем обработчику. В любом случае от парсинга вы не избавитесь. Но в pull-варианте (читать блоки нужных размеров) он гораздо проще для чтения/реализации, чем в push-варианте (когда данные в парсер кормятся извне по частям). Не понял как ваш код может помочь в ситуации описаной выше. Вы ведь просто читаете данные из стрима и все! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 14:45:19 |
|
||
|
Оптимизация?
|
|||
|---|---|---|---|
|
#18+
GorloPavel, ну ты даешь авторТ.е. сначала читаем длину (readBytes(is, 4)) в этом фишка, а ты по размеру буфера... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 16:54:01 |
|
||
|
Оптимизация?
|
|||
|---|---|---|---|
|
#18+
GorloPavelMasterZivGorloPavel, Тебе уже говорили, tcp - потоковый протокол, там НЕТ пакетов. Ты должен сам буферизировать и собирать свои пакеты. А там и сеть мои пакеты! 4 байта заголовок. Великолепно, только потоковый протокол tcp об этом не знает... Если у тебя проблемы с реализацией на java — это понятно, но tcp тут очевидно ни при чем. Кстати, ты можешь попробовать UDP и почувствовать разницу, как говорится... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 19:56:06 |
|
||
|
Оптимизация?
|
|||
|---|---|---|---|
|
#18+
GorloPavelBasil A. SidorovПакет вида "длина данных, данные" - не очень хорошее решение, т.к. вы не можете начинать отправку, не узнав размер отправляемых данных. Начнёте делать конвейер - или вас проклянут или сами себя проклянёте. Предложите решение лучше и что-бы не было недостатков описанных в первом посте. Если бы я понимал, в чем твоя проблема, я бы предложил уже давно решение... Но похоже, ты даже сам не понимаешь. Ну, все же попытаюсь тебе объяснить.... (позже, вечером). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2013, 20:00:01 |
|
||
|
Оптимизация?
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Не, уже завтра только. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2013, 02:00:14 |
|
||
|
Оптимизация?
|
|||
|---|---|---|---|
|
#18+
am_sasaGorloPavel, ну ты даешь авторТ.е. сначала читаем длину (readBytes(is, 4)) в этом фишка, а ты по размеру буфера... Перечитайте первый пост еще раз. Причем тут ваш код. Данные могут приходить склееными или частями... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2013, 16:54:36 |
|
||
|
Оптимизация?
|
|||
|---|---|---|---|
|
#18+
MasterZivGorloPavelпропущено... Предложите решение лучше и что-бы не было недостатков описанных в первом посте. Если бы я понимал, в чем твоя проблема, я бы предложил уже давно решение... Но похоже, ты даже сам не понимаешь. Ну, все же попытаюсь тебе объяснить.... (позже, вечером). Нет ни какой проблемы. Есть решение. Я спрашиваю можно ли сделать оптимальнее? Проблемы такие могут быть без этого кода: Клиент шлет севреру: "Привет друг!" Сервер сначала получает: "Прив", потом "ет друг". Как на сервере обрабатывать свои пакеты? Как понять что мой пакет пришел полностью и я могу что-то там делать? псевдокод: Код: sql 1. 2. Вот тут кокраз и решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2013, 16:59:22 |
|
||
|
Оптимизация?
|
|||
|---|---|---|---|
|
#18+
GorloPavelПредложите решение лучше и что-бы не было недостатков описанных в первом посте.Читать входной поток данных, пока он не закончится. Разных вариантов форматирования сообщений - вагон и маленькая тележка: от (канонических) текстовых строк (CRLF) до MIME/XML и прочих JSON-ов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 18:19:55 |
|
||
|
|

start [/forum/search_topic.php?author=DIMGAN&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
get settings: |
10ms |
get forum list: |
17ms |
get settings: |
11ms |
get forum list: |
23ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
212ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
81ms |
get tp. blocked users: |
2ms |
| others: | 910ms |
| total: | 1319ms |

| 0 / 0 |
