在websocket中复用通道

时间:2015-07-20 12:57:30

标签: java websocket socket.io multiplexing

我正在开发一个需要实时通信和文件上传的应用程序。我最好喜欢通过多路复用通道进行单一连接。我看到websocket协议有一个扩展,允许多路复用但我不认为有浏览器支持,如果有...我不知道如何使用它。

我想在java中开发服务器。 socketio的节点服务器有一个奇怪的命名空间错误,而它的java服务器无法正常使用命名空间。

我想要一个简单的多路复用系统,这样我就可以同时发送一些json和二进制文件。是否存在这样的事情,或者我是否需要自己创建一些东西,如果是这样的话......我从哪里开始?

2 个答案:

答案 0 :(得分:2)

我想指出的一点是 Multiplexing 不是支持多种消息格式,因为webSocket没有指定正文格式,所以它类似于HTTP,你可以发送JSON,图片,二进制......任何你想要的东西。

多路复用是关于如何重用一个连接通道来支持多种通信(电信中的类似概念),这通常用于多个模块需要websocket通信但只有一个连接的场景中允许(如SocketJS),然后我们可以使用多路复用技术来拯救世界。

更多信息请参阅: https://github.com/sockjs/websocket-multiplex https://www.rabbitmq.com/blog/2012/02/23/how-to-compose-apps-using-websockets/

答案 1 :(得分:1)

客户端有预制的Javascript库,包括这一个:WebSocketFileTransfer

对于服务器端解决方案,我不太了解。我可能会选择两个websocket连接或使用HTML5 javascript将文件分成更小的websocket消息 - 这将允许psedo-multiplexing通过这样的事实,即可以在文件块之间发送不同的websocket消息。

我更喜欢Ruby而且我可能会使用Plezi framework来编写我的应用程序(或者至少是websocket后端)...但是我不确定你提到的命名空间问题是否仍会打扰你通过将文件分成块来决定伪复用。

修改

我只是想一想,除非你把发送的文件分成稍后重新组装的小块,否则很难就上传过程给出反馈...

您的websocket服务器(除非您自己编写)在文件传输完成之前不会让您知道传入的数据,因此您无法更新客户端收到的数据。此外,如果断开连接,则分割文件可能会重新启动上传。

考虑到这一点,我会选择单个连接并将每个文件分成多个块(可能每100Kb左右一块,具体取决于您的服务器和预期用途)。