2013-10-20 197 views
0

我試着創建一個多線程服務器套接字。它可以發送可用文件的字符串或文件作爲流。 問題是else塊,它發送請求的文件作爲流,工作一次。我的代碼中的問題在哪裏以及它爲什麼只回復一次?Java多線程服務器套接字

public class ServerThread extends Thread { 

Socket socket = null; 

public ServerThread(Socket socket) { 
    this.socket = socket; 
} 


public void run() { 
    try { 
     String message = null; 
     PrintStream ps = null; 
     String string = null; 
     File file = null; 


     BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     ps = new PrintStream(socket.getOutputStream()); 

     while ((message = bufferedreader.readLine()) != null) { 

      if (message.equals("list")) { 
       ps.println(Arrays.toString(getServerFiles())); 

      } else { 
       message = "FilesServer\\" + message; 
       file = new File(message); 

       //JOptionPane.showConfirmDialog(null, message); 
       if (file.exists()) { 
        BufferedInputStream bfInStream = 
          new BufferedInputStream(new FileInputStream(message)); 
        BufferedOutputStream bufOutStream = 
          new BufferedOutputStream(socket.getOutputStream()); 

        byte[] buffer = new byte[1024]; 
        int read = 0; 

        while ((read = bfInStream.read(buffer)) != -1) { 
         bufOutStream.write(buffer, 0, read); 
         bufOutStream.flush(); 
        } 
        bufOutStream.close(); 
        System.out.println("File transfered"); 
       } 
      } 
     } 
    } catch (Exception e) { 
     //JOptionPane.showConfirmDialog(null, e.getMessage()); 
    } 
} 

private static String[] getServerFiles() { 
    String result[]; 
    File folder = new File("FilesServer\\"); 
    File[] listOfFiles = folder.listFiles(); 



    result = new String[listOfFiles.length]; 
    for (int i = 0; i < listOfFiles.length; i++) { 
     if (listOfFiles[i].isFile()) { 
      result[i] = listOfFiles[i].getName(); 
     } 
    } 
    return result; 
} 

}

上面的類是從這個類叫做:

public class Server { 

private int defaultPort = 8088; 

public static void main(String[] args) throws IOException { 
    new Server().InitServer(); 
} 


private void InitServer() throws IOException{ 
    ServerSocket serversocket = new ServerSocket(8081); 

    while(true){ 
     Socket socket = serversocket.accept(); 
     new ServerThread(socket).start(); 
    } 
} 

}

+2

調用'bufOutStream.close'也關閉底層套接字 – MadProgrammer

回答

0

對於服務器應用程序,你應該使用ServerSocket的。每次新客戶端請求文件時(通過accept()方法),ServerSocket都必須創建新的Socket。然後,您將字節發送到新創建的套接字並可以安全地關閉它。

+0

感謝您的答覆。但它已經從另一個類發起。 – Meisam

+0

好的,我看到你的更新。 –

0

請勿打開和關閉BufferedOutputStream bufOutStream。而是直接寫入ps並在while循環後關閉它。

正在關閉bufOutStream按照MadProgrammer已經提到的關閉了套接字。

+0

我按照指導更改了代碼,但它仍然不起作用 – Meisam

+0

這是我的代碼[link](https://docs.google.com/file/d/0B9RLwsPgO8cbQzR1WTQ5SXcyTnM/edit?usp=sharing) – Meisam

+0

我檢查了您的ServerThread並寫了一個簡單的測試。此測試對您的代碼沒有(相關)更改。 「不相關」是,我剛剛從ByteArrayInputStream(message.getBytes())返回了一些字節,而不是FileInputStream(消息)。現在看來,在你的東西的其他地方可能還有其他一些問題。但這與你的問題無關。 – cybye

相關問題