2013-04-04 2 views
0

У меня есть этот код на стороне сервера: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, если i закрыть это: 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) 

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

+0

Примечание. Если вы используете Java SE 7, рассмотрите возможность использования новой функции автоматического управления ресурсами для закрытия ваших потоков. – Puce

+0

Возможный дубликат [DataInputStream никогда не останавливается] (http://stackoverflow.com/questions/15807999/datainputstream-never-stops) –

ответ

1

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

От docs

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. 

Помимо, его всегда хорошая практику иметь такие методы, как близко() в конце концов блока

0

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

близко метод FilterOutputStream вызывает его метод промывки, а затем вызывает близкий способ его основной выходной поток.

Плюс, Javadoc for Socket утверждает, что, когда вы закрываете Socket s inputStream или outputStream, оно также закроет соответствующий разъем.

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

+0

Прежде всего спасибо вам обоим. Дело в том, что если я не закрою этот DataOutputStream, тогда когда я получаю (используя inFromClientR.readine()) программные петли навсегда .. (и на стороне клиента все в порядке. i dont forget '\ n') – Nicolaos

+0

Возможно, вам стоит добавить этот фрагмент кода к вашему вопросу (или запустить новый вопрос, не уверен, что лучше). Сейчас трудно ответить, потому что мы не можем видеть, что делает ваш код. – mthmulders

+0

будет делать спасибо ..... – Nicolaos