2017-02-20 18 views
0

Я пишу TCP-сервер и клиент, в котором клиент отправит файл, и сервер сохранит его. Мой посыл/функция сохранения следующим образом:SocketException при чтении файла с помощью BufferedInputStream

Сервер

public void saveFile2(Socket clientSocket) throws IOException 
{ 
    BufferedInputStream bis = new BufferedInputStream(clientSocket.getInputStream()); 
    DataInputStream dis = new DataInputStream(bis); 
    String fileName = dis.readUTF();   
    File file = new File(fileName); 
    FileOutputStream fos = new FileOutputStream(file); 
    BufferedOutputStream bos = new BufferedOutputStream(fos);    
    int byteCount; 
    byte[] buffer = new byte[4096]; 
    while ((byteCount = bis.read(buffer, 0, buffer.length)) > 0) 
    { 
     System.out.println("Test byteCount = "+byteCount); 
     bos.write(buffer, 0, byteCount); 
     break; 
    } 
    System.out.println("Saved file"+file.getName()); 
    bos.close(); 
    dis.close(); 
} 

Client

public void sendFile2(String xmlpath) throws IOException, InterruptedException 
{ 
    BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream()); 
    DataOutputStream dos = new DataOutputStream(bos); 
    File file = new File(xmlpath); 
    System.out.println("Sending File : " + file.getName()); 
    dos.writeUTF(file.getName()); 
    FileInputStream fis = new FileInputStream(file); 
    BufferedInputStream bis = new BufferedInputStream(fis); 
    int bytesCount; 
    byte[] buffer = new byte[4096]; 
    System.out.println("Sending file to server."); 
    while ((bytesCount = fis.read(buffer)) > 0) 
    { 
     System.out.println(bytesCount); 
     bos.write(buffer, 0, bytesCount); 
    } 
    System.out.println("Finished sending."); 

    bis.close(); 
    dos.flush(); 
} 

Обратите внимание, что я добавил перерыв; команду в цикл while сервера, и программа работает отлично. Но когда я исключаю, я получаю это исключение:

Test byteCount = 394 
java.net.SocketException: Connection reset 
     at java.net.SocketInputStream.read(SocketInputStream.java:209) 
     at java.net.SocketInputStream.read(SocketInputStream.java:141) 
     at java.io.BufferedInputStream.fill(BufferedInputStream.java:246) 
     at java.io.BufferedInputStream.read1(BufferedInputStream.java:286) 
     at java.io.BufferedInputStream.read(BufferedInputStream.java:345) 
     at xml.xmlServer.saveFile2(xmlServer.java:72) 
     at xml.xmlServer.run(xmlServer.java:31) 

Это может произойти только тогда, когда я включаю BufferedInputStream и BufferedOutputStream в моем коде. Может ли кто-нибудь помочь мне объяснить, что вызывает это исключение?

ответ

0

Вы читаете имя файла, но вы не отправляете имя файла. Вам не хватает вызова writeUTF() в отправителе.

Вам также необходимо закрыть розетку в отправителе или DataOutputStream.

bos.write(buffer, 0, bytesCount); 

Действительно, это должно быть

dos.write(buffer, 0, bytesCount); 
Смежные вопросы