【问题标题】:Sending a file from server to client without sending it line by line [duplicate]将文件从服务器发送到客户端而不逐行发送[重复]
【发布时间】:2013-06-26 05:22:44
【问题描述】:

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

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

客户:

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
    }
}

如果我的文件比较大(比如说几十万行),这意味着我的服务器需要每行发送数据行。更不用说它必须在发送之前读取文件并使用它的内存来存储字符串。感觉效率很低。

我想知道是否有一种方法可以在不浪费这么多资源的情况下将文件从我的服务器发送到我的客户端。谁能帮我解决这个问题?

简而言之:我可以将文件从我的服务器发送到我的客户端,而不必通过我的文件流式传输并逐行发送。

【问题讨论】:

  • 资源浪费在哪里? 5k 行的文件并不罕见。此外,您的代码似乎还不错。
  • 好吧,让我们假设我的文件要大得多。如果我将来收到不寻常的文件,我不想遇到任何问题。
  • 我没有看到乒乓球、请求响应消息的理由。这个问题重要吗?
  • @Val 不,这不重要,它是更大应用程序的一部分。我真正要问的唯一一件事是,是否有一种方法可以将我的数据从我的服务器发送到我的客户端,而不必通过我的文件流式传输并逐行发送它的内容。
  • 那么,你基本上要求一个函数 copy(stream1, stream2)?如果它存在,我认为通用函数不会在您的每一行添加“FD”前缀。

标签: java sockets


【解决方案1】:

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

类似

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

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

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

(编辑)顺便说一句,在不指定编码方式的情况下操作行/字符串是非 ascii 文件错误的收据。

【讨论】:

    猜你喜欢
    • 2015-05-02
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多