Ява - не может читать из сокета - PullRequest
0 голосов
/ 02 августа 2011

Я создал ServerSocket и читаю сообщения от разных клиентов.Один из клиентов настаивал на том, что мое приложение не работает правильно после отправки своих сообщений.Мне удалось получить трассировку TCP и увидеть, что они действительно отправляли свои сообщения, но мое серверное приложение не считывало данные из сокета.Я получаю дамп потока, и все, кажется, там хорошо:

"Reader Thread" daemon prio=3 tid=0x0ae8a000 nid=0x999 runnable [0x14525000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:129)

В чем может быть причина, по которой я не могу читать сообщения из потока?Кстати, другие клиенты не страдают подобными проблемами.

private byte[] readByte(int readCount) throws Exception {
    int b;
    int readedCount = readCount;
    byte[] receiveBuffer = new byte[readCount];
    while( true ) {
        if( readCount > 0 ) {
            b = inputStream.read(receiveBuffer, readCount - readedCount, readedCount);
        } else {
            b = 0;
        }
        if( b < 0 ) {
            throw new UnrecoverableSocketException("Connection is Broken");
        } else {
            readedCount = readedCount - b;
        }
        if( readedCount == 0 ) {
            return receiveBuffer;
        }

    }
}

Ответы [ 2 ]

1 голос
/ 02 августа 2011

Возможно, readCount не соответствует тому, сколько данных фактически доступно в потоке.Если ваш клиент отправил 10 байтов, а вы ожидали 12, ваш код застрял бы в ожидании этих двух дополнительных байтов.

0 голосов
/ 02 августа 2011

Большая часть вашего метода readByte () может быть реализована с использованием DataInputStream.readFully (), и вы получите выгоду в несколько миллионов раз от объема проведенного тестирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...