繁体   English   中英

通过TCP socket/s传输多张图片

[英]Transfer multiple images through TCP socket/s

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

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

- - - 更新 - - -

谢谢大家的回复。

我更新了这篇文章以写一些额外的信息来回答你的一些问题。

  • 系统客户端/服务器位于本地(家庭)网络中,不会将数据传输到Internet,因此连接带宽不是问题。
  • 网格还将包含图像的缩略图,当使用双击单独套接字上的缩略图时,我将按需加载图像。
  • 我从客户端编写代码,服务器都写在 java 中。
  • 我们有一个客户端可以连接到少量服务器,但每次只有一个客户端没有与不同服务器的并行连接。

我的想法是,如果使用单个套接字,我必须将图像大小、图像名称分开,所以我必须为每个图像发送一个带有名称的字符串,以及一个长的大小。 抛出单个套接字最好在连接开始时一起请求图像,然后以串行方式一对一发送所有图像,或者在请求第二个图像后抛出单个套接字发送图像请求获取图像回复并得到第二个答复。

如果我使用多个 sockets,每个图像请求一个套接字我希望打开 sockets 的最大数量,我可以使用线程池并使用一个可运行的来管理一个图像传输抛出一个套接字吗?

再次感谢你。

如果您同时负责服务器和客户端,则没有理由不使用单个连接一次加载多个(全部)图像。 当然会更有效率。

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

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

除了 TCP sockets 的设置时间可能微不足道的减少之外,我想不出使用单个插槽的任何特殊优势。

所以总的来说,我会 go 为每个文件提供一个套接字。

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

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

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

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

    • 图像的大小(以要传输的字节计),

    • 客户端和服务器之间路由的网络带宽和延迟(可能会改变)

    • 网络拥塞

    • 服务器负载/过载

  • 您还需要决定是针对单个客户端优化,还是针对使用同一应用程序的多个客户端进行优化; 即您是否“在乎”您的应用程序对服务的其他用户的影响。


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM