大量数据 - 发送它们的最佳方式是什么?

时间:2009-01-02 01:21:18

标签: java networking data-transfer

我们有这种情况:

包含这些数据所需的所需数据和客户端组件的服务器。

在服务器上存储了2种类型的数据:   - 一些信息 - 基本上只是几个字符串   - 二进制数据

我们在获取二进制数据时遇到问题。双方都是用Java 5编写的,所以我们有两种方式......

由于速度,内存等原因,Web服务不是最佳解决方案......

那么,你更喜欢什么?

如果可能,我想错过低级套接字连接......

提前致谢

维特克

8 个答案:

答案 0 :(得分:5)

我认为执行大量数据的唯一方法是使用原始套接字访问。

使用大多数其他方法,您将遇到大文件的内存不足问题。

套接字处理在Java中非常简单,它可以让您流式传输数据而无需将整个文件加载到内存中(这是在没有自己缓冲的情况下在幕后发生的事情)。

使用这种策略,我设法构建了一个系统,允许传输任意大的文件(我使用7+ GB DVD映像来测试系统),而不会遇到内存问题。

答案 1 :(得分:5)

查看W3C标准MTOM,将二进制数据作为SOAP服务的一部分进行传输。它是高效的,因为它作为二进制发送,也可以作为缓冲块发送。它还将与其他客户或提供商互操作:

How to do MTOM Interop

Server Side - Sending Attachments with SOAP

答案 2 :(得分:2)

您可能需要查看protobuf,这是Google用来交换数据的库。它非常有效和可扩展。在旁注中,永远不要低估装满1TB硬盘的旅行车的带宽!

答案 3 :(得分:1)

我已经尝试将二进制数据转换为Base64,然后通过SOAP调用发送它,这对我有用。我不知道这是否算作一项网络服务,如果确实如此,那么你几乎就是插座了。

答案 4 :(得分:1)

一些选项:

  • 您可以使用RMI来隐藏套接字级别的东西,也许gzip数据......但如果连接失败,它将不会为您恢复。可能也会遇到内存问题。

  • 只使用二进制mime类型HTTP数据(也可能在Web服务器上配置gzip)。简历中的类似问题。

  • 产生类似wget的东西(我想这可以做简历)

  • 如果客户端已有数据(以前的版本),则rsync只会复制更改

答案 5 :(得分:0)

旧的,经济实惠且强大的FTP怎么样?例如,您可以轻松地在服务器端组件中嵌入FTP服务器,然后编写FTP客户端代码。 FTP就是为此而生的(文件传输协议,不是吗?),而带有附件的SOAP并没有考虑到那些东西而设计得非常糟糕。 例如,您可以查看:

http://mina.apache.org/ftpserver/

但是还有其他实现,Apache Mina是我能记得的第一个。

祝你好运&问候

答案 6 :(得分:0)

sneakernet可以选择吗? :P

RMI以其易用性和内存泄漏而闻名。被警告。根据我们谈论的数据量,sneakernet和套接字都是不错的选择。

答案 7 :(得分:0)

GridFTP视为您的传输层。另请参阅this question