我正在考虑在我的项目中通过 WebSocket(我当前正在使用)使用 Socket.IO。我还没有使用过 Node.js。当我尝试使用 Socket.IO 时,我意识到 Node.js 是实现此功能的必须条件。我有几个问题要问。
- 与WebSocket类似吗
- 我可以在没有 Node.js 的情况下使用 Socket.IO
- 在哪里可以学习如何将 Socket.IO 与 Servlet 一起使用
- 我是否需要添加单独的库文件才能在 Servlet 中使用 Socket.IO(我使用的是 Java 8)。如果是,哪一个是正确的。
我正在使用 Glass-fish 服务器。我的项目中只使用了hibernate,没有使用其他框架,其他的我也不熟悉。
最佳答案
1) 是的。它类似于纯 websocket。但是netty-socketio:
使用socket-io协议(protocol);
支持内存/Hazelcast/Redisson 存储来存储开箱即用的 session ;
- 支持优雅降级到长轮询和闪存;
基于事件模型。您必须将数据发送到套接字:
42["eventName", your_data_objects]
哪里
- 4 - 消息的数据包类型;
- 2 - 事件的内部类型;
- eventName - 事件的名称,它必须与 Java
@OnEvent
处理程序中的名称相同(见下文)。
您可以根据需要组织 your_data_objects,例如,编写类似 HTTP: 的内容
42["eventName", {headers map}, data(primitive, array or object)]
42["createUser", {"requestId": "UUID"}, {
"firstName": "John",
"lastName": "Dow"
}]
42["deleteUser", {}, 10]
42["getUsers", {}, [1,2,3,4,5]]
等等
需要通过 http 连接
ws://host/socket.io/?transport=websocket
(需要传输设置);
- 需要发送乒乓数据包
- 2 - PING,
- 3 - 乒乓球
在客户端和服务器之间或在服务器配置中禁用它(不推荐,这对于死 session 很有用)。
支持握手阶段轻松编写授权;
支持房间。您可以加入/离开房间(基于 Hazelcast/Redisson 中的 pub/sub)并仅为这些房间发送广播事件;
支持确认回调(可以禁用);
总而言之,netty-socket-io是非常有用、稳定的工具,可以在生产中使用。
2)当然。您可以在 Java 后端使用 netty-socket-io。以及客户端的套接字io 库。甚至是纯 websocket:
var ws = new Websocket("ws://localhost:9060/socket.io/?transport=websocket");
setInterval(function(){ sendHeartbeat(); }, 5000);
function sendHeartbeat() {
ws.send("2");
}
ws.onopen = function() {
ws.send('42["doSomething", {"header1": "value1"}, {"key1": "value1"}');
}
Java:
public class Controller {
@OnEvent("doSomething")
public void doSomething(SocketIOClient client, Headers headers, Something something) {
client.sendEvent("doSomethingSuccess", null, responseHeaders, responseObject);
}
}
并在配置中路由到 Controller :
server.addListeners(new Controller());
3)遗憾的是,关于netty-socket-io的信息很少,你可以尝试一下,遇到麻烦时创建新的问题;
4) 您需要将 netty-socket-io 添加到您的依赖项中。 Hazelcast 或 Redisson(如果您打算使用它们来存储 session 和房间订阅)。 Jackson 用于 json 序列化/反序列化。仅此而已。
关于node.js - 将 Socket.IO 与 Servlet 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35673673/