2011-04-12 266 views
2

我想通過套接字發送文件以及其他一些信息。我正在使用下面的代碼Java通過套接字發送文件

public void receiveFile(Socket socket,int filesize,String filename) throws IOException 
{ 
    //after receiving file send ack 
    System.out.println("waiting "); 
// int filesize=70; // filesize temporary hardcoded 

long start = System.currentTimeMillis(); 
int bytesRead; 
int current = 0; 
// localhost for testing 
System.out.println("Connecting..."); 

// receive file 
byte [] mybytearray = new byte [filesize]; 
InputStream is = socket.getInputStream(); 
FileOutputStream fos = new FileOutputStream(filename); 
BufferedOutputStream bos = new BufferedOutputStream(fos); 
bytesRead = is.read(mybytearray,0,mybytearray.length); 
current = bytesRead; 
System.out.println("recv..."+mybytearray.length); 
do { 
    bytesRead = 
     is.read(mybytearray, current, (mybytearray.length-current)); 
    System.out.println(bytesRead); 
    if(bytesRead > 0) current += bytesRead; 
} while(bytesRead > 0); 

bos.write(mybytearray, 0 , current); 
bos.flush(); 
long end = System.currentTimeMillis(); 
System.out.println(end-start); 
bos.close(); 
System.out.println(" File received"); 
} 

收到文件後,我必須收到一些其他的字符串。但是當我嘗試讀取輸入流時,我正在獲取文件的內容。如何從輸入流中清除文件的內容。

BufferedReader inFromServer = 
      new BufferedReader(new InputStreamReader(
       webServerSocket.getInputStream())); 

receiveFile(webServerSocket,filesize,filename); 
    while(true) 
    { 
     msg = inFromServer.readLine(); //here i receive the contents of the file again 
    System.out.println(msg); 
    } 
+0

我可以知道webServerSocket是什麼嗎? – 2013-07-31 05:47:51

回答

3

傳遞套接字的輸入流的receivefile法,而不是插座本身:

InputStream is = webServerSocket.getInputStream(); 
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(is)); 

receiveFile(webServerSocket,filesize,filename); 

問題在於,我相信,在事實上,你必須通過由同一插座二個inputstreams在相同的時間點(在實際讀取任何數據之前)。它們指向同一個流,但是從一個流中讀取也不會移動另一個流,因此,在從輸入流BA讀取一個流被標記在位置15(例如)而Inpustream A仍然處於流0開始處的採樣0時。

(編輯:) 當然,您必須在receiveFile方法中使用inputstream,而不是從套接字中獲取一個。另一種解決辦法是讓從插座中的InputStream調用後接收文件,如

receiveFile(webServerSocket,filesize,filename); 

BufferedReader inFromServer = 
      new BufferedReader(new InputStreamReader(webServerSocket.getInputStream())); 
+0

+1:另外一點是,如果你不清楚自己在做什麼,你可以使用流作爲二進制或文本,但不能同時使用。 ;) – 2011-04-12 13:45:31

+0

我意識到了這個問題。爲了簡單起見,我只是從inFromServer再次讀取以進行刷新。我不想更改代碼太多 – Sam 2011-04-12 14:15:58

+0

我可以知道webServerSocket是什麼嗎? – 2013-07-31 05:48:08

1

通過閱讀該文件後,您將已經閱讀整個文件。如果你仍然得到文件的內容,你還沒有閱讀整個文件。