2011-10-08 149 views
3

我在java中使用服務器套接字概念來傳輸文件,如圖像和視頻。但是當我在客戶端收到時,我正在自定義文件名。我可以得到該文件的原始名稱嗎?服務器套接字文件傳輸

例如:

如果從服務器端的文件傳輸「的abc.txt」,我需要此相同的名稱在客戶端被反射(不通過單獨的名稱)。

在服務器端:

public class FileServer { 
    public static void main (String [] args) throws Exception { 
    // create socket 
    ServerSocket servsock = new ServerSocket(13267); 
    while (true) { 
     System.out.println("Waiting..."); 

     Socket sock = servsock.accept(); 
     System.out.println("Accepted connection : " + sock); 
     OutputStream os = sock.getOutputStream(); 
    new FileServer().send(os); 
     sock.close(); 
     } 
    } 

    public void send(OutputStream os) throws Exception{ 
     // sendfile 
     File myFile = new File ("C:\\User\\Documents\\abc.png"); 
     byte [] mybytearray = new byte [(int)myFile.length()+1]; 
     FileInputStream fis = new FileInputStream(myFile); 
     BufferedInputStream bis = new BufferedInputStream(fis); 
     bis.read(mybytearray,0,mybytearray.length); 
     System.out.println("Sending..."); 
     os.write(mybytearray,0,mybytearray.length); 
     os.flush(); 
    } 
} 

在客戶端:

public class FileClient{ 
    public static void main (String [] args) throws Exception { 


    long start = System.currentTimeMillis(); 


    // localhost for testing 
    Socket sock = new Socket("127.0.0.1",13267); 
    System.out.println("Connecting..."); 
    InputStream is = sock.getInputStream(); 
    // receive file 
    new FileClient().receiveFile(is); 
     long end = System.currentTimeMillis(); 
    System.out.println(end-start); 

    sock.close(); 
    } 

    public void receiveFile(InputStream is) throws Exception{ 
     int filesize=6022386; 
     int bytesRead; 
     int current = 0; 
     byte [] mybytearray = new byte [filesize]; 

     FileOutputStream fos = new FileOutputStream("def"); 
     BufferedOutputStream bos = new BufferedOutputStream(fos); 
     bytesRead = is.read(mybytearray,0,mybytearray.length); 
     current = bytesRead; 


     do { 
      bytesRead = 
       is.read(mybytearray, current, (mybytearray.length-current)); 
      if(bytesRead >= 0) current += bytesRead; 
     } while(bytesRead > -1); 

     bos.write(mybytearray, 0 , current); 
     bos.flush(); 
     bos.close(); 
    } 
} 

回答

2

是的,只是實際的文件內容日前將元數據(在你的情況myFile.getName()),使客戶端和服務器讀取和發射出的元數據。使用已建立的協議是一個不錯的主意,例如HTTP和它的Content-Disposition標題。

+0

但事情是,即時通訊發送這樣的文件數組到客戶端。我不能將文件的名稱追加到文件的字節數組中。如果是,請告訴我如何去做。 – Arun

+0

@Arun當然你可以,你只需要設計一個協議。你使用的是什麼序列化方法/協議?在問題中包含實際發送或接收文件的代碼(<15行)將非常有幫助。 – phihag

+0

我用完整的源代碼編輯了我的問題。這實際上是從此問題中發佈的鏈接中獲取的。請幫助我。這麼晚纔回復很抱歉。 – Arun

4

對於接收器知道文件名,或者:

一)它必須承擔它知道的名字,因爲這是自找的,

二)服務器首先發送名稱流的一部分。

如果發明一種方式,沒有真正發送發送信息,讓我知道,我們可以成爲億萬富翁。我們可以稱之爲'電腦心靈感應'。

+0

我發送文件作爲字節數組到客戶端。請注意一件事...它會包含文件的名稱還是不包含? – Arun

+0

如果您發送名稱,它將包含名稱,否則該文件不太可能包含自己的名稱。 –

1

有一個更簡單的方法來做到這一點。只需在DataInputStream中包裝輸入流並使用像.writeUTF(myFile.getName())這樣的方法。同樣,您可以通過在DataInputStream上應用.readUTF來讀取接收方的文件名。下面是一個示例代碼: 發信人:

FileInputStream fis = new FileInputStream(myFile); 
    BufferedInputStream bis = new BufferedInputStream(fis); 
    DataInputStream dis = new DataInputStream(bis); 
    OutputStream os; 
    try { 
     os = socket.getOutputStream(); 
     DataOutputStream dos = new DataOutputStream(os); 
     dos.writeUTF(myFile.getName()); 
.............////// catch exceptions 

接收機:

InputStream in; 
    try { 
     bufferSize=socket.getReceiveBufferSize(); 
     in=socket.getInputStream(); 
     DataInputStream clientData = new DataInputStream(in); 
     String fileName = clientData.readUTF(); 
     System.out.println(fileName); 
................../////// catch exceptions