Отсутствуют байты передачи файла ServerSocket - PullRequest
1 голос
/ 28 июля 2011

Выпуск

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

Вот базовое представление соответствующих частей клиентского потока на сервере.

this.data_in = new DataInputStream(sock.getInputStream());
this.in = new InputStreamReader(this.data_in);

Сервер будет считывать данные аутентификации, используя BufferedReader, и после завершения аутентификации он будет читать данные из сокета, например, так. Переменная 'fos' представляет собой FileOutputStream, в который записываются данные DataInputStream.

int read = 0;
byte[] buffer = new byte[8192];
while((read = data_in.read(buffer)) != -1) {
    fos.write(buffer, 0, read);
    bytes_received += read;
}

Это все кажется правильным в концепции, однако на практике первые 1450 байтов прочитанного файла отсутствуют. Я попытался использовать новый DataInputStream (sock.getInputStream ()) на случай, если позиция в потоке была странной, но все же не повезло. Спасибо за любую помощь!

Обновление 1

Чтобы я мог использовать функциональность BufferedReader, я сделал метод для чтения в строковых строках, как я использовал их раньше. Смотрите ниже код.

int input;
boolean run = true;
while((input = in.read()) != -1 && run) {
    run = true;
    char[] chars = Character.toChars(input);
    for(char c : chars) {
        if(c == '\n') {
            run = false;
            break;
        } else if(c != '\r') {
            sb.append(c);
        }
    }
}

Каким бы прекрасным ни казалось решение, все еще отсутствует 1450 байт информации. Может быть, я иду в неправильном направлении здесь?

Ответы [ 2 ]

1 голос
/ 28 июля 2011

Мне кажется, что проблема BufferedReader - согласно http://ulibgcj.sourceforge.net/javadoc/java/io/BufferedReader.html имеет размер буфера по умолчанию 8192 ... независимо от того, какой размер буфера по умолчанию в вашем случае, BufferedReader будет продвигаться впередdata_in в шагах этого размера буфера по умолчанию ... поэтому, даже если вы их не используете, data_in обычно находится на позиции после последних байтов, которые вы использовали во время аутентификации.

1 голос
/ 28 июля 2011

Похоже, у вас есть два отдельных потока / считывателя, которые ссылаются на одно и то же: this.data_in и this.in.Чтение с одного из них продвигает поток, а затем считывание с другого «пропускает» данные, которые были прочитаны в другом.Кроме того, вы используете DataInputStream точно так же, как обычный старый InputStream, используя метод read (byte []) .DataInputStream - это специализированный поток с определенной целью.

...