2013-04-16 199 views
0

我有一個服務器和客戶端連接使用套接字來傳輸文件,但如果我想能夠從客戶端發送字符串到用戶JButton操作時服務器,它會拋出套接字關閉錯誤(因爲我用dos發件人()構造函數中的.close())。問題是,如果我不使用dos.close(),客戶端程序將不會運行/ init UI框架。我究竟做錯了什麼?我需要能夠在程序第一次運行時發送文件,然後再發送數據。套接字關閉問題

發件人:

public Sender(Socket socket) { 

    List<File> files = new ArrayList<File>(); 
    files.add(new File(Directory.getDataPath("default.docx"))); 
    files.add(new File(Directory.getDataPath("database.db"))); 

    try { 
     BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream()); 
     DataOutputStream dos = new DataOutputStream(bos); 
     dos.writeInt(files.size()); 
     for (File file : files) { 
      dos.writeLong(file.length()); 
      dos.writeUTF(file.getName()); 
      FileInputStream fis = new FileInputStream(file); 
      BufferedInputStream bis = new BufferedInputStream(fis); 
      int theByte = 0; 
      while ((theByte = bis.read()) != -1) { 
       bos.write(theByte); 
      } 
      bis.close(); 
     } 
     dos.close(); // If this is disabled, the program won't work. 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

下載:

public static byte[] document; 

public Downloader(Socket socket) { 
    try { 
     BufferedInputStream bis = new BufferedInputStream(socket.getInputStream()); 
     DataInputStream dis = new DataInputStream(bis); 
     int filesCount = dis.readInt(); 
     for (int i = 0; i < filesCount; i++) { 
      long size = dis.readLong(); 
      String fileName = dis.readUTF(); 
      if (fileName.equals("database.db")) { 
       List<String> data = new ArrayList<String>(); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(bis)); 
       String line; 
       while ((line = reader.readLine()) != null) { 
        if (line.trim().length() > 0) { 
         data.add(line); 
        } 
       } 
       reader.close(); 
       parse(data); 
      } else if (fileName.equals("default.docx")) { 
       ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
       for (int x = 0; x < size; x++) { 
        bos.write(bis.read()); 
       } 
       bos.close(); 
       document = bos.toByteArray(); 
      } 
     } 
     //dis.close(); 
     } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

回答

0

在客戶端你的第一個接收循環終止在EOS,僅當您在發送關閉套接字發生,你不想做。你要發送的長度提前在每種情況下的文件,以便接收代碼看起來應該像這樣在兩種情況下:

long total = 0; 
while ((total < size && (count = in.read(buffer, 0, size-total > buffer.length ? buffer.length : (int)(size-total))) > 0) 
{ 
    total += count; 
    out.write(buffer, 0, count); 
} 
out.close(); 

這個循環從套接字讀取輸入流中恰好size字節,並將其寫入到OutputStreamout ,無論out恰巧是:在第一種情況下,一個FileOutputStream,在第二個,ByteArrayOutputStream

+0

所以我會用這兩個while和循環我有接收器? – CBennett

+0

這就是'兩種情況'的意思,是的。 – EJP