2015-09-08 3 views
0

У меня есть некоторые проблемы. У меня есть клиент и сервер. Клиент подключается к серверу через TCP. Затем клиент отправляет некоторые данные (разделенные кусками), я не знаю, какова длина данных (рукопожатие TLS). Но я знаю, что клиент отправляет некоторые данные с фиксированной длиной, а затем останавливается, пока не получит какой-либо ответ, а затем снова отправит данные с фиксированной длиной.Как читать данные из сокета, пока клиент не остановит отправку?

Мне нужно прочитать все куски, пока клиент не остановит отправку (потому что так много кусков). Как это сделать ?

У меня есть только одна идея, это таймаут. Прочитайте данные в цикле и установите тайм-аут между итерацией. Если тайм-аут завершен, данные собираются.

Возможно, есть более элегантное решение?

+1

Можете ли вы привести пример того, что вы пытаетесь сделать? Вопрос не имеет смысла, как есть. – JimB

+0

Я не совсем понимаю ваш вопрос, но, как правило, вы представляете тело с «io.Reader», и вы можете просто прочитать его до конца ... В случае фрагментированного ответа вы полностью абстрагированы от отдельные куски, вы видите это как поток текстовых данных ... То же, что и тело, которое было подано сразу. Надеюсь, это поможет. – evanmcdonnal

+0

@JimB Browser (aka client), подключитесь к моему серверу и прокси-сайту https. Для прокси-сервера через https браузер отправляет запрос CONNECT, прослушивает ответ 200 OK, а затем посылает мне зашифрованные данные, например, chunk1 - 167 bytes, chunk2 - 312 bytes, chunk3 - 72 байта Затем браузер останавливается , и ожидание ответа, после получения ответа браузера снова отправить куски. Мне нужно собрать chunk1, chunk2, chunk3 в одном куске, но я не знаю, когда браузер остановился, чтобы отправить куски, и переключитесь в состояние ожидания. Надеюсь, теперь это ясно :)? – sintanial

ответ

2

Основываясь на информации в ваших комментариях, вы делаете это неправильно. Правильный способ написания прокси-сервера HTTPS состоит в том, чтобы прочитать строку CONNECT, сделать восходящее соединение, отправить соответствующий ответ обратно клиенту, а затем, если успешно начать копирование байтов в обоих направлениях одновременно. Вы никоим образом не связаны с пакетами или размерами чтения, и вы, конечно же, не должны пытаться «собирать» пакеты перед повторной передачей, поскольку это просто добавит латентность в систему.

Вы можете выполнить это либо путем запуска двух потоков на одно соединение, по одному в каждом направлении, либо через неблокирующие сокеты и select()/poll()/epoll(), или что бы то ни было, что похоже на Go.

BUT Я понятия не имею, почему вы это делаете вообще. Существует много HTTP-прокси-серверов с открытым исходным кодом, которые уже существуют, и поскольку вы имеете дело с HTTPS, нет никакой ценности, которую вы можете добавить к ним. Ваше утверждение о «бизнес-логике» бессмысленно или, по крайней мере, невозможно реализовать.

Смежные вопросы