java - 具有多个 ClientEndpoint 和二进制消息的 WebSocket

标签 java session mobile websocket codenameone

概述:

我目前有一个功能齐全的移动应用程序,可以通过 WebSocket 与 Windows 上运行的 Java 服务器进行通信。 ServerEndpoint 正在 AWS 计算机上运行。 Java 服务器是在专用网络上运行的 ClientEndpoint,并且在任何给定时间都可以有多个应用程序用户也是 ClientEndpoint。

我目前在来回发送字符串消息时一切正常,因为 ServerEndpoint 正在维护 Java 服务器 session 以及移动应用程序 session 。几乎所有通信都是通过移动应用程序发起的,此时 JSON 字符串被发送到 Java 服务器 session ,以便能够维护哪个移动应用程序 session 应接收返回消息。

我现在正在尝试实现能够以相同方式通过二进制消息从 Java 服务器向移动应用程序发送 PDF 文件的功能。移动应用程序是使用 Codename One 开发的,它们不提供增加最大二进制消息大小的能力,因此我似乎将每个二进制消息限制为 8kb(8,192 字节)。这很好,因为我正在发送多个二进制消息并在移动应用程序中重建文件。

目前,我在最简单的情况下执行此操作,即一次只有一个移动应用程序用户请求 PDF 文件。

当前流量:

应用程序 A 将 JSON 消息发送到 ServerEndpoint,然后将消息转发到 Java 服务器 A。Java 服务器 A 将 JSON 消息发送回 ServerEndpoint,后者将消息转发回应用程序 A。JSON 对象包含用于发送消息的 session ID回到。 ServerEndpoint 需要知道将来自 Java 服务器的消息发送到哪个应用程序 session 。 当涉及二进制消息时,应用程序 A 向 ServerEndpoint 发送一条字符串消息,然后服务器端点将消息转发到 Java 服务器 A。Java 服务器 A 现在需​​要将多条二进制消息发送回 ServerEndpoint,所有这些消息都必须转发到应用程序 A 以获取文件才能正确重建。这是我不确定如何处理的部分。目前来说,如果只有一个App session ,是可以正常工作的,但是如果多个App session 同时请求文件,就无法正常工作。

问题:

发送字符串消息时,很容易将回调移动应用程序 session ID 作为 JSON 对象的一部分来回传递,以确保正确的移动应用程序 session 获得响应。在发送二进制消息时,保证如果用户 A 和 B 同时请求文件,用户 A 得到他/她请求的文件,用户 B 得到他/她请求的文件的最佳方法是什么?

最佳答案

您应该能够跟踪 session ,而无需传递 session ID。例如,参见this sample web service endpoint .

请注意如何使用 @OnMessage 注释将 Session 对象作为第一个参数传递。

您可以使用它来了解您正在与谁交谈。

还有一个小问题/问题。您的声明“移动应用程序是使用代号一开发的,并且它们不提供增加最大二进制消息大小的能力”,似乎表明其他平台确实允许您在客户端上设置最大二进制消息大小。 AFAIK 这不是 WebSocket 规范的一部分,并且没有由任何浏览器实现。还有哪些其他实现允许您设置最大大小?

编辑回应您对问题的改进:

剥这只猫的皮有多种方法。一种想法是,您只需要分块“最后一英里”(中间人和客户之间)。由于中间人和终端服务器是 JavaEE 服务器,因此您可以控制缓冲区大小,并且有可能一次性发送完整文件(在合理范围内)。然后只需在中间服务器中进行分块,它就会知道他正在处理哪个客户端。

另一个选择是创建您自己的伪协议(protocol)。您将返回字节数组,但您可以选择分配每个 block 的前 n 个字节来包含元数据,中间人将解析这些元数据。此元数据可用于告诉中间人该 block 的目的地是哪个客户端。

关于java - 具有多个 ClientEndpoint 和二进制消息的 WebSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37819361/

相关文章:

mobile - 有什么办法可以查到手机的位置吗?

java - 如何使用 Hashmap 进行键绑定(bind)?

asp.net - 使用 Azure Redis 缓存 session 状态提供程序维护跨不同域的 session

php - UNSET 不适用于 Zend Session

css - 如何使这个 CSS 响应?

javascript - 跟踪移动安装邀请的可靠技术

java - 检索 JTextPane AttributeSet 值

java - 测量正在运行的进程(不是我启动的进程)的磁盘 I/O

java - LWUIT标签: Using image as a label

打开多个窗口选项卡时的 php session 问题