2010-04-21 50 views
2

我正在與Java套接字進行聊天實現。我專注於一些功能,如身份驗證,一人聊天和羣聊。我正在考慮添加文件傳輸功能,我想知道這有什麼好的做法。我應該在服務器上使用不同端口的獨立套接字來監聽文件傳輸嗎?現在,從服務器套接字獲得的輸入和輸出流分別綁定到Scanner和PrintWriter對象,因此我很難將其用於文件傳輸。如何使用Java套接字實現文件傳輸?

任何模式,你們可以推薦或給我很好的建議非常感激。

感謝,

ZeKoU

回答

3

好,FTP會爲每個文件傳輸一個新的套接字。請注意,連接可以與用於聊天的端口建立在同一個端口上,但具有不同的初始化對話框。

-1

如果你可以使用本地lib做到這一點,它會更快。否則,除非有充分的理由,否則可以使用一個能夠解決所有問題的庫。

如果你真的需要用純Java發送文件。這是基於我的一箇舊項目的一種方法。但是請注意,有一些序列化開銷,但是可以通過使用與here相關的NIO等效內容來消除其中的大部分內容,或者您​​可以稍微進一步並使用Zero Copy,它可以讓操作系統直接將文件複製到套接字,而不需要任何中介副本。這隻適用於文件,而不適用於其他數據。

您應該在單獨的線程中執行此操作,以便在文件傳輸過程中聊天仍然有效。創建一個套接字並給它一些標準的端口(你可以給它端口0,它只是選擇下一個可用的端口,但是你需要把這個信息發送給另一個接收端,所以只需使用標準端口就更容易)。然後將文件分割成塊,並使用插座傳送它:

//Send file (Server) 
//Put this in a thread 
Socket socket = new Socket(destinationIP, destinationPort); 
ObjectOutputStream sender = new ObjectOutputStream(socket.getOutputStream()); 
sender.writeObject(dataToSend); 

//Receive File (Client) 
//Kick off a new thread to receive the file to preserve the liveness of the program 
ServerSocket serverSocket = new ServerSocket(ListenPort); 
socket = new Socket(); 
while (true) { 
     new Thread(new TCPReceiver(socket)).start(); 
} 

//Receive file thread TCPReceiver(Socket socket) 
//Get the stream where the object is to be sent 
ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream()); 

/* Where type is the type of data you send... String or anything really... 
    read part of the file into something and send it then at this end use the same data              
    type to recieve it and it will magically pull the entire object across. 
*/ 
while(fileIsIncomplete){ 
    type recievedData = (type) objectInputStream.readObject(); 
    //Reconstruct file 
} 

希望這是足以讓你得到一個快速的文件發送方和運行:)

編輯:刪除廢話聲明。添加了原生點和零拷貝提及。

+0

添加序列化的開銷不可能比直接在TCP'金屬'上運行的FTP更快。 – EJP 2016-12-11 00:46:42

+0

如果純FTP是可行的,那也是如此。鑑於這是一個Java應用程序,它可能需要在沒有本地FTP庫的機器上移植。當然,根據我在一臺沒有鎖定的Windows機器上的日期來判斷。所以除非你在應用程序中捆綁了一個,否則你不能承擔本地的可行性。我寫這篇文章已經很長時間了,我不記得我的意思是「提高FTP的速度和效率」,也許和我在編寫代碼之前嘗試的任何lib相比,因爲這條代碼沒有意義。它仍然是純Java中發送文件或其他任何文件的有效代碼。 – feldoh 2016-12-13 16:51:30