WebSocket - Java 脚本客户端说已连接,但 Java 服务器没有
WebSocket - Javascript client says connected, but Java server doesn't
我有非常简单的代码,但它不能完美运行。
在 Java 服务器中,它只是在打开和关闭连接时说 Hello 和 Bye,并打印已发送的消息:
@ApplicationScoped
@ServerEndpoint("/tictactoe")
public class WebSocketServer {
private Logger logger = Logger.getLogger(this.getClass().getName());
@OnOpen
public void open(Session session) {
logger.info("WebSocket: Hello - " + session.getId());
}
@OnClose
public void close(Session session) {
logger.info("WebSocket: Farewell - " + session.getId());
}
@OnMessage
public void messageHandler(String message, Session session) {
logger.info("WebSocket: New Message - " + message);
}
}
在 JavaScript 中,它的作用与在服务器中几乎相同,并在单击按钮时发送消息:
var socket = new WebSocket("ws://localhost:8080/TicTacToeZTP/tictactoe");
socket.onopen = function (event) {
console.log("WebSocket: Connected");
console.log("WebSocket: " + checkConnection(socket.readyState));
};
socket.onclose = function (event) {
console.log("WebSocket: Disconnected");
};
socket.onerror = function(event) {
console.log("WebSocket: Error");
};
socket.onmessage = function (event) {
console.log("WebSocket: New Message - " + event.data);
};
function checkConnection(readyState) {
switch(readyState){
case 0: return "CONNECTING";
case 1: return "OPEN";
case 2: return "CLOSING";
case 3: return "CLOSED";
default: return "UNDEFINED";
}
}
$("#send").click(function () {
var msg = {
type: "message",
text: "zaladzi"
};
socket.send(JSON.stringify(msg));
});
现在是解决问题的时候了。 刷新 页面后 已建立连接。
脚本内容:
WebSocket: Connected
WebSocket: OPEN
但是服务器没有打开一个新的。事实上,有时我需要刷新几次才能在服务器上打开一个新连接。
服务器说的内容:
Info: WebSocket: Hello - 29538711-f815-4c59-835e-97aaaac1d112
Info: WebSocket: Farewell - 29538711-f815-4c59-835e-97aaaac1d112
我正在使用 Payara 4.1 服务器。如何解决这个问题?
TL/DR JavaScript 客户端说连接已 打开 ,但 Java 客户说 没有 这样的 连接 。
这可能是由于 Payara Server 中的一个错误,该错误已修复 https://github.com/payara/Payara/issues/536 重新使用套接字时,服务器中不会调用 OnOpen。
您可以尝试 pre-release 版本的 Payara 以确保它已修复。 Pre-release 构建可从 the Payara website 获得,每次他们的 Jenkins CI 服务器完成 GitHub 合并构建时,都会创建并上传新的 pre-release 构建。
我有非常简单的代码,但它不能完美运行。
在 Java 服务器中,它只是在打开和关闭连接时说 Hello 和 Bye,并打印已发送的消息:
@ApplicationScoped
@ServerEndpoint("/tictactoe")
public class WebSocketServer {
private Logger logger = Logger.getLogger(this.getClass().getName());
@OnOpen
public void open(Session session) {
logger.info("WebSocket: Hello - " + session.getId());
}
@OnClose
public void close(Session session) {
logger.info("WebSocket: Farewell - " + session.getId());
}
@OnMessage
public void messageHandler(String message, Session session) {
logger.info("WebSocket: New Message - " + message);
}
}
在 JavaScript 中,它的作用与在服务器中几乎相同,并在单击按钮时发送消息:
var socket = new WebSocket("ws://localhost:8080/TicTacToeZTP/tictactoe");
socket.onopen = function (event) {
console.log("WebSocket: Connected");
console.log("WebSocket: " + checkConnection(socket.readyState));
};
socket.onclose = function (event) {
console.log("WebSocket: Disconnected");
};
socket.onerror = function(event) {
console.log("WebSocket: Error");
};
socket.onmessage = function (event) {
console.log("WebSocket: New Message - " + event.data);
};
function checkConnection(readyState) {
switch(readyState){
case 0: return "CONNECTING";
case 1: return "OPEN";
case 2: return "CLOSING";
case 3: return "CLOSED";
default: return "UNDEFINED";
}
}
$("#send").click(function () {
var msg = {
type: "message",
text: "zaladzi"
};
socket.send(JSON.stringify(msg));
});
现在是解决问题的时候了。 刷新 页面后 已建立连接。
脚本内容:
WebSocket: Connected
WebSocket: OPEN
但是服务器没有打开一个新的。事实上,有时我需要刷新几次才能在服务器上打开一个新连接。
服务器说的内容:
Info: WebSocket: Hello - 29538711-f815-4c59-835e-97aaaac1d112
Info: WebSocket: Farewell - 29538711-f815-4c59-835e-97aaaac1d112
我正在使用 Payara 4.1 服务器。如何解决这个问题?
TL/DR JavaScript 客户端说连接已 打开 ,但 Java 客户说 没有 这样的 连接 。
这可能是由于 Payara Server 中的一个错误,该错误已修复 https://github.com/payara/Payara/issues/536 重新使用套接字时,服务器中不会调用 OnOpen。
您可以尝试 pre-release 版本的 Payara 以确保它已修复。 Pre-release 构建可从 the Payara website 获得,每次他们的 Jenkins CI 服务器完成 GitHub 合并构建时,都会创建并上传新的 pre-release 构建。