2014-01-08 142 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

我编辑帖子以包含解释 –