java - 您可以在不阻止通过同一 java.net.socket 的其他数据的情况下发送图像吗?

标签 java sockets networking network-programming networkstream

情况是这样的:

我正在开发一个项目,我需要能够偶尔向服务器发送一个或多个图像,以及用文本表示的许多其他类型的数据。目前完成的方式是发送一条消息,其中显示“大小为 x 的传入图像将用作 y”(当然,它不是“以这种方式制定”的),然后我调用一个读取下一个 x 的方法通过 DataInputStream 的字节。起初,我遇到了一些延迟问题,把事情搞砸了,但我让服务器生成一个新线程来发送“传入图像”消息,然后等待客户端响应“我准备好了”时设置的标志对于图像”消息。它现在以某种方式工作,但如果在传输图像时发送其他任何内容,例如聊天消息,则该用于 BufferedReader 的消息将被读取为原始字节并用作图像的一部分。因此,当有图像正在发送时,我必须阻止所有传出数据(并将其添加到队列中)。但这似乎非常错误和烦人,因为应用程序的用户在接收/上传大图像时将无法聊天。

这就是我需要的: 所以,我要么需要建立一个独立的 channel 来用于原始数据。据我从一些修补中了解到,我将不得不在新端口上设置一个新套接字,这似乎没有必要。我可以看到解决这个问题的另一种方法,是以某种方式使用带有“这是文本/原始数据”位的标签每个数据包,但我不知道如何用java来做到这一点?当您向流中写入某些内容(包含该信息的每个数据包都将包含)时,您可以向数据包 header 添加信息,然后读取另一端的数据包数据并采取相应的操作吗?

正如你所看到的,我对网络没有太多经验,也没有使用Java很长时间。这也是我在这里发表的第一篇文章,所以请友善。如果有什么不清楚的地方,请询问,我会具体说明。欢迎所有想法! (可能有一个标准方法可以做到这一点?)

非常感谢!

最佳答案

TCP 协议(protocol)本身没有任何可以帮助您的内容。 您要么打开一个新的套接字连接(可以连接到同一服务器端口),要么将图像分割成较小的 block ,并将这些 block 包装在信封中,说明它是什么类型的消息:图像或聊天。然后在接收端根据这些 block 重建图像。但这会浪费带宽并增加其自身的复杂性(例如,您将该图像的一 block 有多大?)。
我会使用单独的二进制数据连接。

关于java - 您可以在不阻止通过同一 java.net.socket 的其他数据的情况下发送图像吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4513613/

相关文章:

swift - 套接字阻塞 UI 的挑战(我相信是这样)

java - 如何处理网络故障代码并恢复?

java - 在 Java 中导出到 CSV/Excel

java - 计算 JTable 中的列和行中的值的总和

java - 自定义相机应用程序在拍摄2-3张照片后停止工作,没有错误消息

javascript - 使用node.js连接socket.io

java - 如何增加itext Pdf中PdfPTable的宽度

node.js - 登录后如何连接到socket - JWT

docker - 多平台 Docker 内部网络从主机连接

c - 段错误和使用 Valgrind 进行调试