java - 无法从 Java WebSocket 向 JS 客户端发送消息
问题描述
我是 Java WebSocket 的新手,正在尝试简单的 WebSocket 客户端-服务器通信。我能够将消息从客户端发送到服务器端点。我也可以在服务器端点接收消息,但无法发送给客户端。
我的服务器端点看起来像 -
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint(value = "/satya")
public class TesWS {
Session gSession;
Map<String, Session> sessions = new ConcurrentHashMap<>();
@OnOpen
public void onOpen(Session session) {
System.out.println("New Session got connected");
this.gSession = session;
System.out.println("onOpen Session - " + session.toString());
sessions.put(session.toString(), session);
}
@OnClose
public void onClose() {
}
@OnMessage
public void onMessage(String s, Session session) {
System.out.println("New Text Message Received : " + s);
for (Session sess : session.getOpenSessions()) {
if (sess.isOpen()) {
System.out.println("onMessage Session - " + session.toString());
session.getAsyncRemote().sendText("Message From Java");
System.out.println("Messgae Sent from Java");
}
}
}
@OnError
public void onError(Throwable e) {
e.printStackTrace();
}
}
我的 JS 客户端代码是 -
<html>
<head>
<style>
#messages {
text-align: left;
width: 50%;
padding: 1em;
border: 1px solid black;
}
</style>
<title>Sample WebSocket Client</title>
</head>
<body>
<div class="container">
<div id="messages" class="messages"></div>
<div class="input-fields">
<p>Type a message and hit send:</p>
<input id="message"/>
<button id="send">Send</button>
<p>Select an image and hit send:</p>
<input type="file" id="file" accept="image/*"/>
<button id="sendImage">Send Image</button>
</div>
</div>
</body>
<script>
const messageWindow = document.getElementById("messages");
const sendButton = document.getElementById("send");
const messageInput = document.getElementById("message");
const fileInput = document.getElementById("file");
const sendImageButton = document.getElementById("sendImage");
const socket = new WebSocket("ws://localhost:9090/jERRY/satya");
socket.binaryType = "arraybuffer";
socket.onopen = function (event) {
addMessageToWindow("Connected");
};
socket.onmessage = function (event) {
alert("GOT MESSAGE");
addMessageToWindow(`Got Message: ${event.data}`);
if (event.data instanceof ArrayBuffer) {
addMessageToWindow('Got Image:');
addImageToWindow(event.data);
} else {
addMessageToWindow(`Got Message: ${event.data}`);
}
};
sendButton.onclick = function (event) {
sendMessage(messageInput.value);
messageInput.value = "";
};
sendImageButton.onclick = function (event) {
let file = fileInput.files[0];
sendMessage(file);
fileInput.value = null;
};
function sendMessage(message) {
socket.send(message);
addMessageToWindow("Sent Message: " + message);
}
function addMessageToWindow(message) {
messageWindow.innerHTML += `<div>${message}</div>`
}
function addImageToWindow(image) {
let url = URL.createObjectURL(new Blob([image]));
messageWindow.innerHTML += `<img src="${url}"/>`
}
</script>
</html>
JAVA 输出-
New Session got connected
onOpen Session - org.apache.tomcat.websocket.WsSession@21bca102
New Text Message Received : xz x cx c
onMessage Session - org.apache.tomcat.websocket.WsSession@21bca102
Messgae Sent from Java
客户端输出
解决方案
推荐阅读
- mysql - MySQL 组从季度到期间
- python - 数据框递归地计算带有条件的值[复杂的逻辑]
- c# - 使用 ssh.net 长文本执行命令如何解析这个退格?
- email - 有没有办法以编程方式验证 EWS 服务器 URL?
- javascript - 如何设置在箭头函数外部定义的变量的值(Axios、react、javascript)
- node.js - Stripe - 有没有办法获得当前/特定月份的产品收入?
- javascript - 如何在 vue.js 中销毁滑块 vue-awesome-swiper?
- pandas - 尝试将“org.apache.spark.sql.DataFrame”对象转换为 Pandas 数据框会导致 Databricks 中出现错误“未定义名称‘数据框’”
- mysql - 如何使用 phpmyadmin 根据 MYSQL 中另一个字段的值输入字段的默认值
- python - 初学者 Python 程序员在这里,努力使用逻辑 OR 运算符