让 Jetty Websocket 使用与 JavaScript Websocket 相同的语言
Getting Jetty Websocket talking same language as JavaScript Websocket
我编写了一个连接到远程服务器并尝试发送 JSON 请求的 Jetty Websocket 客户端。服务器拒绝无效请求并关闭我的连接。但是,当我使用 Java 脚本客户端发送完全相同的 JSON 时,它工作得很好。所以现在我挠头了,是 Jackson 2 对 JSON 还是 JSON.stringify() 的编码? (差异显示两个 JSON 输出完全相同,没有差异)。 Javascript Websockets 和 Jetty 之间的默认配置不同吗?我肯定错过了什么,我的头撞在墙上。
Java 侧边片段:
final String wsAddress = "ws://" + wssUrl + "/ws";
final WebSocketClient client = new WebSocketClient();
final WSEventSocket socket = new WSEventSocket(loginRequest);
try {
client.start();
final ClientUpgradeRequest request = new ClientUpgradeRequest();
final URI wsUri = new URI(wsAddress);
logger.info("Connecting to {}", wsUri);
final Future<Session> session = client.connect(socket, wsUri, request);
final String requestjson = mapper.writeValueAsString(wsRequestPojo);
final Future<Void> fut = session.getRemote().sendStringByFuture(requestjson);
...
Java脚本边片段:
var wsRequestJson = {...Use output from Java Side...}
var mySock = new WebSocket("ws://" + wsocketUrl + "/ws");
mySock.onmessage = function(evt) { console.log(evt.data); }; mySock.onclose = function() { console.log("CLOSED"); };
mySock.send(JSON.stringify(wsRequestJson));
Java脚本端工作完美,Java端没有正确编码数据。我已经尝试了很多东西,比如 JSON 到字节数组,但运气不佳。我通过 Wireshark 连接了两个事务,并且看到了 WebSocket 推送和响应。在 Java 中,我看到一个看起来与 JSON 完全一样的有效负载,并且 Wireshark 对其进行了解密。在 Java 脚本数据包上,我看到了某种类型的编码数据 4P1n204... ?
知道如何让 Java Jetty 端以类似的方式对数据进行编码吗?甚至 Java 脚本端使用的是什么类型的编码?我现在可能想多了...
谢谢!
正如@Joakim Erdfelt 在上面的评论中所述,Java脚本端默认使用 Sec-Websocket-Extension: permessage-deflate。可能不是设置它的最佳方式,但我通过添加更新了我的 Java 代码:
request.addExtensions(ExtensionConfig.parse("permessage-deflate"));
更新的代码段:
final String wsAddress = "ws://" + wssUrl + "/ws";
final WebSocketClient client = new WebSocketClient();
final WSEventSocket socket = new WSEventSocket(loginRequest);
try {
client.start();
final ClientUpgradeRequest request = new ClientUpgradeRequest();
request.addExtensions(ExtensionConfig.parse("permessage-deflate"));
final URI wsUri = new URI(wsAddress);
logger.info("Connecting to {}", wsUri);
final Future<Session> session = client.connect(socket, wsUri, request);
final String requestjson = mapper.writeValueAsString(wsRequestPojo);
final Future<Void> fut = session.getRemote().sendStringByFuture(requestjson);
...
很有魅力!谢谢!
我编写了一个连接到远程服务器并尝试发送 JSON 请求的 Jetty Websocket 客户端。服务器拒绝无效请求并关闭我的连接。但是,当我使用 Java 脚本客户端发送完全相同的 JSON 时,它工作得很好。所以现在我挠头了,是 Jackson 2 对 JSON 还是 JSON.stringify() 的编码? (差异显示两个 JSON 输出完全相同,没有差异)。 Javascript Websockets 和 Jetty 之间的默认配置不同吗?我肯定错过了什么,我的头撞在墙上。
Java 侧边片段:
final String wsAddress = "ws://" + wssUrl + "/ws";
final WebSocketClient client = new WebSocketClient();
final WSEventSocket socket = new WSEventSocket(loginRequest);
try {
client.start();
final ClientUpgradeRequest request = new ClientUpgradeRequest();
final URI wsUri = new URI(wsAddress);
logger.info("Connecting to {}", wsUri);
final Future<Session> session = client.connect(socket, wsUri, request);
final String requestjson = mapper.writeValueAsString(wsRequestPojo);
final Future<Void> fut = session.getRemote().sendStringByFuture(requestjson);
...
Java脚本边片段:
var wsRequestJson = {...Use output from Java Side...}
var mySock = new WebSocket("ws://" + wsocketUrl + "/ws");
mySock.onmessage = function(evt) { console.log(evt.data); }; mySock.onclose = function() { console.log("CLOSED"); };
mySock.send(JSON.stringify(wsRequestJson));
Java脚本端工作完美,Java端没有正确编码数据。我已经尝试了很多东西,比如 JSON 到字节数组,但运气不佳。我通过 Wireshark 连接了两个事务,并且看到了 WebSocket 推送和响应。在 Java 中,我看到一个看起来与 JSON 完全一样的有效负载,并且 Wireshark 对其进行了解密。在 Java 脚本数据包上,我看到了某种类型的编码数据 4P1n204... ?
知道如何让 Java Jetty 端以类似的方式对数据进行编码吗?甚至 Java 脚本端使用的是什么类型的编码?我现在可能想多了...
谢谢!
正如@Joakim Erdfelt 在上面的评论中所述,Java脚本端默认使用 Sec-Websocket-Extension: permessage-deflate。可能不是设置它的最佳方式,但我通过添加更新了我的 Java 代码:
request.addExtensions(ExtensionConfig.parse("permessage-deflate"));
更新的代码段:
final String wsAddress = "ws://" + wssUrl + "/ws";
final WebSocketClient client = new WebSocketClient();
final WSEventSocket socket = new WSEventSocket(loginRequest);
try {
client.start();
final ClientUpgradeRequest request = new ClientUpgradeRequest();
request.addExtensions(ExtensionConfig.parse("permessage-deflate"));
final URI wsUri = new URI(wsAddress);
logger.info("Connecting to {}", wsUri);
final Future<Session> session = client.connect(socket, wsUri, request);
final String requestjson = mapper.writeValueAsString(wsRequestPojo);
final Future<Void> fut = session.getRemote().sendStringByFuture(requestjson);
...
很有魅力!谢谢!