DataInputStream

У меня есть этот код на стороне сервера:

Сторона сервера:

 ServerSocket listenTransferSocket = new ServerSocket(6000);
          Socket connectionTransferSocket = listenTransferSocket.accept();

     DataOutputStream outTransferToClient =
         new DataOutputStream(connectionTransferSocket.getOutputStream());
        {
    .......................   (Some code)
    .......................
           }
    outTransferToClient.write(fileInBytes,0,numOfBytes);
           System.out.println("File send");
       **// outTransferToClient.close();**

        BufferedReader inFromClientR =
                 new BufferedReader(new InputStreamReader(connectionTransferSocket.getInputStream()));

Сторона клиента:

Socket fileTransferSocket = new Socket("localhost",6000);
     DataInputStream in = new DataInputStream(new BufferedInputStream(
                                                 fileTransferSocket.getInputStream()));

OutputStream out = new FileOutputStream(new File("./TransferedFiles/"+fileName));

byte[] by = new byte[numOfBytes];

while ((read = in.read(by, 0, numOfBytes)) != -1) {

       out.write(by,0,read); 
   }

  DataOutputStream outToServerR = 
       new DataOutputStream(fileTransferSocket.getOutputStream()); 
     System.out.println("checkC");
        outToServerR.writeBytes("Transfer completed \n");

и я получаю следующее исключение, когда пытаюсь открыть BufferedReader, если закрываю это: outTransferToClient.close();

Exception in thread "main" java.net.SocketException: Socket is closed
        at java.net.Socket.getInputStream(Socket.java:788)
        at Server.main(Server.java:92)

если я этого не сделаю, цикл while на стороне клиента никогда не остановится.. любая помощь????


person Nicolaos    schedule 04.04.2013    source источник
comment
Примечание. Если вы используете Java SE 7, рассмотрите возможность использования новой функции автоматического управления ресурсами для закрытия ваших потоков.   -  person Puce    schedule 04.04.2013
comment
возможный дубликат DataInputStream никогда не останавливается   -  person Peter O.    schedule 04.04.2013


Ответы (2)


DataOutputStream расширяет FilterOutputStream, который имеет метод close()

Из документов

Closes this output stream and releases any system resources associated with the stream.
The close method of FilterOutputStream calls its flush method, and then calls the close method of its underlying output stream.

Кроме того, всегда полезно иметь такие методы, как close() в блоке finally.

person rajesh    schedule 04.04.2013

Да, закрытие DataOutputStream также закрывает базовый OutputStream. Javadoc для DataOutputStream#close() заявляет:

Метод close объекта FilterOutputStream вызывает его метод flush, а затем вызывает метод close базового выходного потока.

Кроме того, в Javadoc для Socket указано, что когда вы закроете Sockets inputStream или outputStream, он также закроет связанный сокет.

Таким образом, вы не можете повторно использовать сокет после закрытия DataOutputStream, который обернул любой из его потоков.

person mthmulders    schedule 04.04.2013
comment
Прежде всего, спасибо вам обоим.. дело в том, что если я не закрою этот DataOutputStream, то, когда я получу (используя inFromClientR.readine()), программа зациклится навсегда.. (и на стороне клиента все в порядке. я не забываю '\ п') - person Nicolaos; 04.04.2013
comment
Возможно, вам следует добавить этот фрагмент кода к своему вопросу (или начать новый вопрос, не уверенный, что лучше). Сейчас сложно ответить, потому что мы не можем видеть, что делает ваш код. - person mthmulders; 04.04.2013