Java TCP Socket отправляет байтовый массив - PullRequest
0 голосов
/ 10 мая 2011

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

Exception in thread "main" java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at fileServer.TCPServer.main(TCPServer.java:193)

Я создаю поток вывода следующим образом:

OutputStream output = clientSocket.getOutputStream()

И ошибка возникает из этой строки: output.write(sendData, 0, sendData.length)

Где sendData - это байтовый массив, который я вручную создаю по согласованному «протоколу», который составляет 28 байтов заголовка вместе с файлом. Файл с ошибкой составляет около 780 КБ, где файл 2 КБ работает отлично. Есть идеи?

РЕДАКТИРОВАТЬ: некоторый добавленный контекст того, как я делаю сокет.

            Socket clientSocket = listenSocket.accept();
        System.out.println("server is listening...");

        DataInputStream input = new DataInputStream(clientSocket.getInputStream());
        OutputStream output = clientSocket.getOutputStream();



        //receive the request packet
        //int nb = input.readInt();
        System.out.println("Read Length " + "28");
        byte[] sentence = new byte[28];
        for(int i=0; i<28; i++){
            sentence[i] = input.readByte();
        }

И вот как я отправляю данные: sendData - это байтовый массив, который я создал для отправки tArray - массив байтов файла, который я копирую в sendData для отправки

for(int i = 0; i<filSize; i++){
   //loads into the packet being built
   //needed to minus 36 since all the header info
   endData[i+36] = tArray[i];
}
System.out.println("send packet size: " + sendData.length);

System.out.print(sendData);
System.out.println("File size is: " + filSize);
int sendDataLength = sendData.length;
try{
    output.write(sendData, 0, sendDataLength);
}catch (IOException e){
    System.out.println("Error: " + e.getMessage());
}
clientSocket.close();

РЕДАКТИРОВАТЬ 2: Я использовал перехват попытки и получил эту ошибку сейчас: Программное обеспечение вызвало прерывание соединения: ошибка записи в сокет

Ответы [ 2 ]

2 голосов
/ 10 мая 2011

Сброс сокета равноправным означает, что другой конец отсоединен неправильно.Убедитесь, что ваш клиент правильно держит сокет открытым.

РЕДАКТИРОВАТЬ: если вы используете код, похожий на этот, вы не должны использовать DataInputStream.Если вы хотите использовать readByte для получения данных, вы должны использовать writeByte на отправляющей стороне.Ваш сброс сокета, вероятно, происходит, потому что вызов readByte не получает ЧТО-ТО, что он ожидает.Не используйте DataInputStream: используйте BufferedInputStream и используйте метод read.

0 голосов
/ 05 июля 2013

Я также погуглил для подобных проблем.

Одна из редко упоминаемых причин связана с проблемой кеша в браузере. Некоторые браузеры сбрасывают соединения из-за неожиданной логики кэша.

Чтобы решить эту проблему, используйте эту строку кода в начале вашего сервлета.

response.addHeader («Cache-Control», «без преобразования, max-age = 0»);

Я получил этот ответ от Сервлета для загрузки видеофайла с сервера . Это может быть не на 100% причиной ваших проблем, но стоит попробовать.

...