java - Java EE Websockets
问题描述
Websockets,无法建立连接。我可以覆盖 OnClose、OnMessage、OnOpen 等方法吗?在@ServerEndpoint Annotation 中添加“value =”有什么区别?
如何使用 RoomID 作为参数?
OnOpen(会话会话,@PathParam "roomID" String roomID)?
EchoServer.java
import java.io.IOException;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import javax.ws.rs.PathParam;
@ServerEndpoint(value = "/echo/{roomID}")
public class EchoServer {
@OnOpen
public void onOpen(Session session){
String roomID = session.getUserProperties().get("roomID").toString();
session.getUserProperties().put("roomID", roomID);
SessionHandler.addSession(session, roomID);
System.out.println(session.getId() + " has opened a connection");
try {
session.getBasicRemote().sendText("Connection Established");
} catch (IOException ex) {
ex.printStackTrace();
}
}
@OnMessage
public void onMessage(String message, Session session){
System.out.println("Message from " + session.getId() + ": " + message);
try {
session.getBasicRemote().sendText(message);
} catch (Exception ex) {
ex.printStackTrace();
}
}
@OnClose
public void onClose(Session session, String roomID){
SessionHandler.removeSession(session, roomID);
System.out.println("Session " +session.getId()+" has ended");
}
}
会话处理程序.java
import java.util.HashMap;
import java.util.Map;
import javax.websocket.Session;
public class SessionHandler {
private static final Map<String, Session> sessions = new HashMap<>();
public static void addSession(Session session, String roomID){
sessions.put(roomID, session);
}
public static void removeSession(Session session, String roomID){
sessions.remove(roomID, session);
}
public static void sendToSession(Session session, String message){
System.out.println("Message from " + session.getId() + ": " + message);
try {
session.getBasicRemote().sendText(message);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
索引.html
<!DOCTYPE html>
<html>
<head>
<title>Echo Chamber</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
</head>
<body>
<div>
<input type="number" id="roomID"/>
<input type="text" id="messageinput"/>
</div>
<div>
<button type="button" onclick="openSocket();" >Open</button>
<button type="button" onclick="send();" >Send</button>
<button type="button" onclick="closeSocket();" >Close</button>
</div>
<!-- Server responses get written here -->
<div id="messages"></div>
<!-- Script to utilise the WebSocket -->
<script type="text/javascript">
var webSocket;
var messages = document.getElementById("messages");
function openSocket(){
if(webSocket !== undefined && webSocket.readyState !== WebSocket.CLOSED){
writeResponse("WebSocket is already opened.");
return;
}
webSocket = new WebSocket("ws://localhost:8080/EchoChamber/echo/{"+document.getElementById("roomID").value+"}");
webSocket.onopen = function(event){
if(event.data === undefined)
return;
writeResponse(event.data);
};
webSocket.onmessage = function(event){
writeResponse(event.data);
};
webSocket.onclose = function(event){
writeResponse("Connection closed");
};
}
function send(){
var text = document.getElementById("messageinput").value;
webSocket.send(text);
}
function closeSocket(){
webSocket.close();
}
function writeResponse(text){
messages.innerHTML += "<br/>" + text;
}
</script>
</body>
</html>
解决方案
好的,看起来像默认方法
onClose(Session session)
应该只接受 1 个参数,我的方法
onClose(Session session, String roomID)
错了。它修复了使用默认方法的所有问题
推荐阅读
- nginx - Nginx 反向代理 - 拒绝访问特定的后端 IP 地址
- jdeveloper - 在 JDeveloper 中使用 lombok
- rcpp - Rcpp 是否启用 C++ 数据类型(例如 int、std::string 等)作为输入或输出参数?
- android - Is it possible to add rectangular corners to layout?
- java - FeignClient: if the response of an API has two different format, how to elegantly deal with such a case?
- powershell - AD 用户不会被 powershell 添加到组中
- python - 如何在 Visual Studio Code 上使用 python 海龟图形绘制递归 Sierpiński 箭头曲线
- javascript - Javascript数组搜索过滤器
- json - 从 JSON 制作模型类
- c# - C#:从字符串版本号中过滤诸如 `-beta1` 和 `hotfix` 之类的内容