我需要设计并实现一个侦听端口1039的迭代TCP服务器应用程序,提供以下服务。 服务器可以访问存储在其主机上的所有ASCII文件。客户端通过发送文件路径(字符串)来请求服务,然后服务器逐字符地读取指定的文件,将字符组装成每个2048个字符的块(或者到达文件末尾时最后一个块的更少)并发送这些向客户端提供2k块数据。
我制作了以下代码。但是我仍然坚持我如何将字符组装成每个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 :(得分: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变量从流中获取读取字符数的原因。
当read返回-1时,我们就在流的末尾。在这种情况下,我们想要写入缓冲区中的内容,即从缓冲区的开头到关闭(到目前为止我们已经读到缓冲区的数量)。
如果阅读> 0,我们只是检查缓冲区是否已满,如果是,我们将其全部发送。否则,我们只是继续阅读,直到它已经到达或直到流的末尾。