【发布时间】:2022-01-10 15:09:00
【问题描述】:
请原谅我的新手问题,但我很困惑,显然不理解如何使用托管在HTTPS 上的 Websocket 服务器的基本原理或解释。我在网上找到的所有内容都让我的问题多于答案。
我在我的HTTPS 网站上使用 Java 代码托管了一个 Websocket 服务器。
这是我的WebsocketServer.java 文件:
import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;
import java.net.InetSocketAddress;
import java.util.HashSet;
import java.util.Set;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class WebsocketServer extends WebSocketServer {
private static final Logger logger = LogManager.getLogger(WebsocketServer.class);
private static int TCP_PORT = 6868;
private static Set<WebSocket> conns;
public WebsocketServer() {
super(new InetSocketAddress(TCP_PORT));
conns = new HashSet<>();
}
@Override
public void onOpen(WebSocket conn, ClientHandshake handshake) {
conns.add(conn);
logger.info("New connection from " + conn.getRemoteSocketAddress().getAddress().getHostAddress());
logger.info("Size of connection list: " + conns.size());
}
@Override
public void onClose(WebSocket conn, int code, String reason, boolean remote) {
conns.remove(conn);
logger.info("Closed connection to " + conn.getRemoteSocketAddress().getAddress().getHostAddress());
}
@Override
public void onMessage(WebSocket conn, String message) {
logger.info("Message from client: {}", message);
// for (WebSocket sock : conns) {
// sock.send("SENDING BACK" + message);
// }
}
@Override
public void onError(WebSocket conn, Exception ex) {
// ex.printStackTrace();
try {
if (conn != null) {
conns.remove(conn);
// do some thing if required
}
logger.info("ERROR from {}", conn.getRemoteSocketAddress().getAddress().getHostAddress());
} catch (Exception e) {
logger.info("onError: WebSocketServer may already be running");
}
}
public Set<WebSocket> getConns() {
return conns;
}
}
然后我像这样开始WebsocketServer:
WebsocketServer websocketServer;
// Start socket server
websocketServer = new WebsocketServer();
websocketServer.start();
在客户端,我像这样连接到它:
// APP_WEB_SOCKET is the url to my site: api.my_custom_domain.com
var connection = new WebSocket("wss://" + APP_WEB_SOCKET + ":6868");
问题:
我一直在读到,如果我想使用 wss 而不是 HTTPS,我需要一个证书,但找不到任何文件以我能理解的方式解释这意味着什么。
我的应用程序托管在 AWS Elastic Beanstalk 环境中。我是否需要在我的 Java 代码中以某种方式将证书添加到 WebsocketServer 的设置中?
示例:
WebsocketServer websocketServer;
// Start socket server
websocketServer = new WebsocketServer();
// example guessing
websocketServer.cert = "SOMETHING";??
websocketServer.start();
客户端代码是否需要更改?
谁需要证书?
如果有人能解释我缺少什么或指出正确的方向,我将不胜感激。
【问题讨论】:
-
Websocket 连接是“升级的 HTTP(S) 调用”,因此您的 HTTP 服务器需要证书才能“与 HTTPS 通信”,然后出于 WS 目的连接到它应该会自动执行正确的操作.
标签: java websocket java-websocket ws