你可以发送图像而不会阻止其他数据通过相同的java.net.socket吗?

时间:2010-12-22 20:54:08

标签: java sockets networking network-programming networkstream

情况就是这样:

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

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

正如您所看到的,我对网络没有太多经验,也没有长时间使用Java。这也是我在这里的第一篇文章,所以要善良。如果有任何不清楚的地方,请询问,我会说明。欢迎所有想法! (有可能采用标准方法吗?)

非常感谢!

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

Java应该对HTTP协议有标准支持 - 使用HTTP进行图片传输,因为您可以设置标头中传输的数据类型。基本上,您可以让客户端/服务器体系结构为每个新数据传输(无论是文本还是图像)建立单独的请求,这样就可以在简单的循环中进行处理。

这可能对您有所帮助:How to use java.net.URLConnection to fire and handle HTTP requests?