0

这是这种情况:

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

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

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

非常感谢!

4

2 回答 2

3

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

于 2010-12-22T21:06:09.823 回答
2

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

这可能对您有所帮助:如何使用 java.net.URLConnection 触发和处理 HTTP 请求?

于 2010-12-22T21:06:15.440 回答