Java: игнорирование входного потока - будут ли переполняться буферы и будут ли плохие вещи? - PullRequest
4 голосов
/ 24 августа 2009

У меня есть клиент, подключающийся к моему серверу. Клиент отправляет на сервер некоторые сообщения, которые мне не нужны, и не хотят тратить время на анализ своих сообщений, если я не собираюсь их использовать. Все, что я использую для ввода-вывода, это простой ввод-вывод Java, а не nio.

Если я создаю входной поток и просто никогда не читаю из него, может ли этот буфер заполниться и вызвать проблемы? Если да, могу ли я что-то сделать или установить свойство, чтобы оно просто выбрасывало данные, которые оно видит?

А что если сервер вообще не создает входной поток? Это вызовет какие-либо проблемы на стороне клиента / отправителя?

Пожалуйста, дайте мне знать.

Спасибо, JBU

Ответы [ 5 ]

5 голосов
/ 24 августа 2009

Когда вы accept подключаетесь от клиента, вы получаете InputStream. Если вы не читаете из этого потока, данные клиента будут помещены в буфер. В конце концов, буфер заполнится, и клиент заблокирует, когда он попытается записать больше данных. Если клиент запишет все свои данные до того, как прочитает ответ с сервера, вы окажетесь в довольно классической тупиковой ситуации. Если вы действительно не заботитесь о данных от клиента, просто прочитайте (или позвоните skip) до EOF и отбросьте данные. В качестве альтернативы, если это не стандартный протокол запросов / ответов (например, HTTP), запустите новый поток, который постоянно читает поток, чтобы предотвратить его резервное копирование.

2 голосов
/ 24 августа 2009

Если вы не получаете полезных данных от клиента, какой смысл разрешать ему подключаться?

1 голос
/ 24 августа 2009

Я не уверен в последствиях никогда не читать из буфера в Java - я предполагаю, что со временем ОС перестанет принимать данные в этот сокет, но я не уверен там.

Почему бы вам просто не вызвать метод пропуска вашего InputStream иногда с большим числом, чтобы гарантировать, что вы отбросите данные?

0 голосов
/ 24 августа 2009
InputStream in = ....
byte[] buffer = new byte[4096] // or whatever
while(true)
  in.read(buffer);

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

0 голосов
/ 24 августа 2009

Я думаю вы получите InputStream, как только вы примете запрос, поэтому, если вы не подтвердите этот запрос, базовая структура (например, tomcat) отбросит этот запрос (после некоторого истекшее время).

Привет.

...