2010-12-22 29 views
0

这种情况:你可以发送图像而不拖延其他数据通过相同的java.net.socket吗?

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

这就是我需要的: 所以,我需要设置一个独立的通道用于原始数据。据我所知,从一些修补,我将不得不在一个新的端口上建立一个新的套接字,这似乎是不必要的。另一种方式,我可以看到要解决这个问题,将以某种方式使用“这是文本/原始数据”位标记每个数据包,但我不知道如何使用java做到这一点?当你向流写入信息(包含该信息的每个数据包将包含)时,是否可以将信息添加到数据包标题中,然后在另一端读取数据包数据并相应地执行操作?正如你所看到的,我没有很多网络方面的经验,也没有很长时间使用过Java。这也是我在这里的第一篇文章,所以要善良。如果有什么不清楚的地方,请问,我会指定。欢迎所有想法! (有可能是一个标准的方法来做到这一点?)

非常感谢!

回答

3

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

+0

好,非常感谢:)我会看一会这个问题,而且很可能去一个单独的数据连接? *查看如何在同一个端口上设置多个连接* – 2010-12-22 21:45:59

+0

您只需打开与第一个连接相同的第二个连接即可。服务器端可以在一个循环中的服务器套接字上接受。 – 2010-12-23 00:25:38

2

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

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

相关问题