Java 通过TCP套接字/s传输多个图像

Java 通过TCP套接字/s传输多个图像,java,sockets,tcp,file-transfer,Java,Sockets,Tcp,File Transfer,我尝试用Java创建一个应用程序,我有一个图像网格。必须通过TCP连接从远程服务器加载每个映像 我的问题是,哪种方法最好?使用一个TCP套接字并通过此请求所有映像,还是为每个映像请求打开一个新的套接字 ---更新--- 谢谢大家的回复 我更新了帖子,写了一些额外的信息,回答了你的一些问题 系统客户端/服务器位于本地家庭网络中,因此不会 传输数据会影响互联网,所以连接带宽不是一个问题 问题 此外,网格将包含图像的缩略图,图像I 当用户双击单独插座上的缩略图时,将按需加载。 我从客户机和服务器编写代

我尝试用Java创建一个应用程序,我有一个图像网格。必须通过TCP连接从远程服务器加载每个映像

我的问题是,哪种方法最好?使用一个TCP套接字并通过此请求所有映像,还是为每个映像请求打开一个新的套接字

---更新---

谢谢大家的回复

我更新了帖子,写了一些额外的信息,回答了你的一些问题

系统客户端/服务器位于本地家庭网络中,因此不会 传输数据会影响互联网,所以连接带宽不是一个问题 问题 此外,网格将包含图像的缩略图,图像I 当用户双击单独插座上的缩略图时,将按需加载。 我从客户机和服务器编写代码,两者都是用java编写的。 我们有一个客户端可以连接到少量的服务器,但每次只有一个,没有并行连接到不同的服务器。 我认为,如果使用单个套接字,我必须将图像大小、图像名称分开,因此我必须为每个图像发送一个带名称的字符串,并为大小发送一个long。抛出单个套接字最好在连接开始时请求所有图像,然后以串行方式一对一发送所有图像,或者抛出单个套接字发送图像请求获取图像回复,请求第二个图像后获取第二个回复

如果我使用多个套接字,每个映像请求一个套接字我希望有最大数量的打开套接字,我可以使用线程池并使用一个runnable来管理一个映像传输和一个套接字吗


再次感谢您。

如果您同时负责服务器和客户端,则没有理由不使用单个连接一次加载多个所有映像。当然,这将更加有效。

如果带宽和服务器容量允许,使用多个套接字将允许并行执行多个传输

对所有传输使用单个套接字的另一个缺点是,您必须找到某种方法让客户端检测每个文件的结尾。使用每个文件的套接字可以简化这一过程,因为远程服务器可以在每个文件之后简单地关闭连接

我想不出使用单个套接字有什么特别的好处,除了TCP套接字的设置时间可能可以忽略不计

所以总的来说,我会为每个文件选择一个套接字


我还注意到HTTP同时使用并行连接和每个套接字的多个下载。但是,后一种优化在传输大量小文件时最为有用,在传输100k+图像文件时不太可能有用。

我认为使用一个TCP套接字更好,因为您有一个图像网格,如果您想为每个图像打开一个套接字,那么套接字的数量将增加,可能会导致问题。
您可以保持套接字对所有图像传输开放,然后将其关闭。这样更易于管理。

我只想指出,这些答案强调一个连接比多个连接更高效或更快。。。反之亦然。。。缺少几个重要问题:

最佳解决方案取决于许多因素,例如:

以要传输的字节为单位,图像的大小

客户端和服务器之间路由的网络带宽和延迟可能会发生变化

网络拥塞

服务器负载/过载

您还需要决定是针对单个客户机进行优化,还是针对使用同一应用程序的多个客户机进行优化;i、 e.你是否在乎你的应用程序对其他服务用户的影响


我的直觉是,通过几个连接,而不是一个连接,您可能会获得更好的吞吐量。但是,由于网络拥塞和各种客户端/服务器端负载问题的组合,打开更多连接实际上会降低吞吐量。在任何情况下都要尽可能快地完成这项工作确实非常困难。

在web服务器中,如果某些映像在磁盘缓存中,而其他映像不在,则多个连接可能是有益的。这完全取决于通道是像单块HTTP连接那样简单,还是像多流SPDY甚至SCTP那样更复杂。更可能的情况是,不需要这样的微观优化。我严重质疑更有效。当然,它避免了多次TCP握手,但在大型传输中,这些握手只占传输时间的一小部分。它还可以防止并行下载,而并行下载肯定更高效。如果在TCP握手中丢失更多带宽,如何提高效率?这并不是说两次并行传输会让你的带宽神奇地翻倍。此外,TCP使用慢启动,这进一步降低了多连接选项的速度。与HTTP相同的问题是,使用更多的资源
对于如此多的短命连接,服务器上的ces和连接时间可能不是无关紧要的。一般来说,对于内部应用程序,如果不使用第三方中间件,开发时间可能会更容易。我确实说过如果服务器容量允许。我更新了我的问题,添加了一些额外的信息。此外,如果你想变得非常棘手,你甚至可以实现一种多路图像传输。从每个图像串行传输数据块。然后在接收端将块存储到相应的图像中。这种方法有两个问题。首先,您当然需要能够控制发送代码。其次,您需要创建一个协议,首先发送每个图像的元数据,例如文件名、格式和长度。这会增加您可能不希望的复杂性。但是,通过使用此功能,您可以有效地并行传输N幅图片。