Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Зависание при чтении InputStream


Автор: DOKA 6.7.2008, 00:20
Доброго дня!


Требуется из входного сокета (m_inSocket) перенаправить поток на выходной сокет (m_outSocket). 
Но проблема в том, что на строчке 
Код

read1 = m_inSocket.getInputStream().read(buff);

чтение в какой-то момент останавливается. Сам не понимаю почему.

Обратите внимание на строку
Код

m_inSocket.setReceiveBufferSize(1);

- если её нет, то зависание происходит гораздо раньше.


Данные перенаправляются целиком только в редких случаях. Помогите, пожалуйста. Вот код:


Код

try
{
                m_inSocket.setReceiveBufferSize(1);
                int read1;
                int read2;
                byte[] buff = new byte[1024*64];
                do
                {
                    read1 = m_inSocket.getInputStream().read(buff);
                    if (read1 > 0)
                    {
                        System.out.println("o  " + read1);
                        m_outSocket.getOutputStream().write(buff, 0, read1);
                    }
                    
                    read2 = m_outSocket.getInputStream().read(buff);
                    if (read2 > 0)
                    {
                        System.out.println("i  " + read2);
                        m_inSocket.getOutputStream().write(buff, 0, read2);
                    }
                    
                } 
                while (read1 != -1 || read2 != -1);
}
catch (IOException e)
{
        e.printStackTrace();
}

Автор: AlexeyVorotnikov 7.7.2008, 09:57
Операция read является блокирующей, т.е. пока не придёт очередная порция данных, программа будет стоять и ждать.

Автор: DOKA 8.7.2008, 12:24
Цитата(AlexeyVorotnikov @ 7.7.2008,  09:57)
Операция read является блокирующей, т.е. пока не придёт очередная порция данных, программа будет стоять и ждать.

Да, спасибо. Решением было использование available().
Только теперь почему-то нагрузга на процессор просто дикая. Как можно не ждать не бегая постоянно в цикле? Да и скорость передачи данных хромает :(

Автор: Platon 8.7.2008, 14:45
Если это клиент, используй отдельный поток, в котором читаешь блок методом read(buffer), если сервер, используй NIO или какой-нибудь фреймворк, типа http://forum.vingrad.ru/faq/topic-177795/hl/mina/index.html

Автор: DOKA 9.7.2008, 12:55
Цитата(Platon @ 8.7.2008,  14:45)
Если это клиент, используй отдельный поток, в котором читаешь блок методом read(buffer), если сервер, используй NIO или какой-нибудь фреймворк, типа http://forum.vingrad.ru/faq/topic-177795/hl/mina/index.html

Хм, и правда. Только что-то потоков много стало smile А самое плохое - соединения не всегда закрываются, несмотря на то, что я для теста выставил таймаут в 2000 мс.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)