从服务器发送文件到客户端而不是逐行发送

时间:2013-06-28 12:22:37

标签: java sockets

如何从服务器向客户端发送文件?

我有一台服务器和一台客户端,可以互相发送消息。 当我在客户端发送请求时,它会向我的服务器发送一条消息,我的服务器将在其文件系统上创建一个文件并将其发送到每行的客户端。

客户端:

socket = new Socket(InetAddress.getByName(address), Integer.parseInt(port));
writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
writer.println("GD"); // GD stands for get data

服务器:

ServerSocket serverSocket = new ServerSocket(Integer.parseInt(port), 0, InetAddress.getByName(address));
socket = serverSocket.accept();
OutputStream writer = socket.getOutputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

// SNIP - readline happens in a thread etc. Not important

String line = reader.readLine();

if("GD".equals(line)) {
    File dataFile = getDataFile();

    BufferedReader br = new BufferedReader(new FileReader(dataFile));
    String line;

    while(null != (line = br.readLine())) {
        writer.send("FD;" + line);
        // FD stands for file data so my client knows that it's a line from the requested file
    }
}

如果我的文件相当大(让我们说数十万行),这意味着我的服务器需要每行发送数据行。更不用说它必须通读文件并使用它的内存来存储字符串,然后再发送它们。感觉非常低效。

我想知道是否有办法将文件从我的服务器发送到我的客户端而不浪费这么多资源。任何人都可以帮我这个吗?

所以简而言之:我是否可以将文件从我的服务器发送到我的客户端,而无需流式传输我的文件并按行发送。

1 个答案:

答案 0 :(得分:2)

除非您需要操作这些行(您似乎插入了字符“FD;”),为什么不将字节缓冲区从一个流复制到另一个流?

的内容
byte[] buffer = new byte[8*1024]
int len;
while ( (len= in.read(buffer)) > 0 ) out.write(buffer, 0, len);

根据网络条件调整缓冲区大小。

现在,恕我直言,甚至不要浪费你的时间做这一切。抓住优秀的,优化的apache commons-ioIOUtils.copy(in, out)

顺便说一下,<编辑(编辑),操作行/字符串而不指定编码方式就是非ascii文件的错误接收。