2012-06-15 4 views
3

Я ищу эффективное решение для приема и обработки асинхронных сообщений (разного размера) из подключения сокета к серверу. Это хорошая пропускная способность (возможно, 250 кБ/с в режиме стабильного состояния и может иметь короткие всплески до 1 МБ/с). В настоящее время я использую DataInputStream, но в трудные моменты я отключился (сервер отключает клиента, если отставание очереди слишком велико).Java DataInputStream vs. BufferedInputStream

Может ли кто-нибудь подтвердить, может ли BufferedInputStream работать лучше? Я читал, что он будет извлекать фрагменты данных за раз, а не байты по байтам, так что меньше вызовов ОС.

Спасибо!

ответ

1

Он извлекает куски за раз, и у него может быть меньше вызовов ОС, но это не поможет, если вы не вызываете чтение достаточно быстро, чтобы обслуживать отставание. Он не будет читать следующий фрагмент, пока вы полностью не прочитаете фрагмент, который он предварительно запрограммировал.

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

1

Я не эксперт, но я знаю, что BufferedInputStream на самом деле будет читать кусок за раз, потому что он будет использовать буфер, размер которого равен X байтам. Это, по сути, абстракция для чтения данных по сокету, а не использование системных вызовов, как вы сказали. Это может помочь в устранении проблемы. Извините, если я повторю некоторые из ваших пунктов. В принципе, я бы предложил использовать буферный поток. Он более контролируется, несколько поисков Google дадут вам гораздо лучшее представление.

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