2014-01-08 186 views
0

我需要設計和實現一個迭代的TCP服務器應用程序監聽端口1039,提供以下服務。 服務器可以訪問存儲在其主機上的所有ASCII文件。客戶端通過發送文件路徑(字符串)來請求服務,然後服務器逐字符地讀取指定的文件,將字符組裝成每個2048個字符的塊(或在到達文件結束時的最後一個塊時減少),並將這些向客戶端提供2k個數據塊。java TCP迭代服務器

我已經產生了下面的代碼。然而,我堅持如何將字符組裝成每個2048個字符的塊(或者在到達文件結束時的最後一個塊時),並將這些2k塊數據發送到客戶端。

import java.io.*; 
import java.net.*; 
import java.util.*; 
public class TcpIterative { 

public static void main(String[] args) 
{ 
    Socket clientSock = new Socket(); 
    ServerSocket servSock; 
    int port = 1039; 

    try{ 
     servSock = new ServerSocket(port); 
     while (true) 
     clientSock = servSock.accept(); 

     BufferedInputStream inps = new BufferedInputStream(clientSock.getInputStream()); 
     InputStreamReader isr = new InputStreamReader(inps); 

     String req = ""; 
     int c= 0; 
     while ((c = isr.read())!=13) 
     { 
      req = req + (char)c; 
     } 

     BufferedOutputStream outs = new BufferedOutputStream (clientSock.getOutputStream()); 
     OutputStreamWriter osw=new OutputStreamWriter(outs, "US-ASCII"); 
     osw.write(responseBuffer); 
     osw.flush(); 

       inps.close(); 
     outs.close(); 
     clientSock.close(); 
    } catch (IOException ex) 
     { 
      System.out.println("Error"); 
     } 

} 
} 
+0

因此,你的問題是1.如何使2k數據包2.如何在其大小小於2K時填滿最後一個數據包3.如何在發送數據包之後發送數據包? –

+0

是的,這是我的問題 – user3074215

回答

0

我會從文件中讀入所需大小的緩衝區。然後,當它已滿或沒有更多數據要讀取時,它將被髮送。像這樣:

int buffSize = 2048; 
int off = 0; 
char[] cbuf = new char[buffSize]; 
while(true){ 
    int read = isr.read(cbuf, off, buffSize - off); 
    if(read == -1){ 
     if(off > 0){ 
      osw.write(cbuf, 0, off); // Send nonfull buffer 
      osw.flush(); 
     } 
     break; 
    }else if(off + read == buffSize){ 
     osw.write(cbuf, 0, buffSize); // Full buffer, send it all 
     osw.flush(); 
     off = 0; 
    }else{ 
     off += read; 
    } 
} 

首先我們啓動一個緩衝區,其中包含所需的緩衝區大小。然後我們想讀入這個緩衝區直到它完整。我們使用off變量來告訴我們已經緩衝了多少。我們無法確定該方法的讀取是否與我們想要的一樣多,這就是爲什麼我們使用read變量從流中獲取讀取字符的數量。

當讀取返回-1時,我們在流的末尾。在這種情況下,我們想寫什麼在我們的緩衝區,即從緩衝區的開始到關閉(到目前爲止我們已經讀取了多少緩衝區)。

如果讀取> 0,我們只需檢查緩衝區是否已滿,如果是的話我們會發送全部。否則,我們會繼續閱讀,直到它到達或者直到流的末尾。

+0

你可能請請向我解釋,閱讀是如何工作的,你爲什麼使用off變量? – user3074215

+0

我編輯帖子以包含解釋 –