java TCP迭代服务器

时间:2014-01-08 08:09:44

标签: java tcp iteration

我需要设计并实现一个侦听端口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");
        }

}
}

1 个答案:

答案 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,我们只是检查缓冲区是否已满,如果是,我们将其全部发送。否则,我们只是继续阅读,直到它已经到达或直到流的末尾。