请教各位一个Java中关于WebSocket的问题

请教各位一个Java中关于WebSocket的问题,如图所示,这个AppointSending方法就是用来将收到的数据解析成String message后发送到前端网页的方法,我最开始以为104行就是发送数据的那一步操作,结果当我进行断点调试的时候,发现一旦进入这个方法,到92行的时候,数据就已经出现在网页上了,而且101行的if括号里的判断条件也为false,也就是根本不会进行到104行那一步,所以我想问的就是这个数据是怎么从后端发送到前端的呢?是一调用这个方法就直接发送了吗?另外就是我在前端的js或html文件里面去哪里找相关的接收这个数据的地方呢?

img

根据你所提供的代码,这个方法内并没有直接发送消息到前端的代码。但是,由于这是一个 WebSocket 的方法,它将获取一个 Session 对象,然后使用 Session 对象来向前端发送消息。

在 WebSocket 中,一个 Session 对象代表与另一个端点的一个 WebSocket 连接,该端点可以是前端网页或另一个后端 WebSocket 客户端。因此,你所说的数据是如何从后端发送到前端是通过 WebSocket 连接实现的。WebSocket 的工作原理是在建立连接后,前端和后端通过这个 Session 对象进行双向通信,因此当有数据需要发送到前端时,它会使用该 Session 对象来发送消息,而前端会在相对应的 JavaScript 代码中编写 WebSocket 的 onmessage 事件来接收这些消息。

回到 AppointSending() 方法,如果该方法被调用说明是有一个 WebSocket 连接已经建立,应该是前端页面在建立 WebSocket 连接时将一些 Cookie 或 Token 发送到后端,后端以此为依据进行身份验证及确认建立 WebSocket 连接,当连接建立成功后,前端向后端发送的消息会通过该 Session 对象传输到后端,后端会解析该消息,进行相应的处理,然后再通过该 Session 对象发送响应消息到前端。

至于前端的 JavaScript 或 HTML,通常情况下,前端会在 JavaScript 中编写相应代码监听接收消息。具体可以参考 WebSocket API 提供的 onmessage 事件进行实现。

答案参考ChatGPT Plus版,整理汇总。希望能帮助你解决问题
根据您提供的代码,可以看出以下几点:

  1. AppointSending方法是用来将收到的数据解析成字符串 message,然后发送到前端网页的方法。
  2. 在第104行的代码 ss.getBasicRemote().sendText(message) 执行了数据的发送操作,将 message 的内容发送到前端。
  3. 根据您的描述,当进入 AppointSending 方法时,数据已经出现在网页上,说明数据的发送是在调用该方法时立即执行的。

在前端接收数据的部分,您需要查找 WebSocket 相关的代码。WebSocket 是一种在浏览器和服务器之间建立持久性连接的通信协议,用于实现双向通信。您可以在前端的 JavaScript 文件中找到 WebSocket 相关的代码,例如使用 WebSocket 对象进行连接和消息接收的部分。

具体而言,您可以在前端的 JavaScript 文件中搜索类似以下代码:

var socket = new WebSocket("ws://your-websocket-url");
socket.onmessage = function(event) {
    var receivedData = event.data;
    // 处理接收到的数据
};

以上代码创建了一个 WebSocket 连接,并通过 onmessage 事件监听接收到的消息,将消息内容存储在 event.data 中,您可以在该部分对接收到的数据进行处理。

请注意,具体的前端代码可能因项目和实际需求而有所不同,以上仅为示例。您需要根据项目的具体情况查找和调整前端代码,以确保正确接收和处理从后端发送的数据。

AppointSending方法的目的是将接收到的数据解析成字符串形式,并发送到前端网页。根据您的描述,该方法似乎在第92行时就将数据发送到前端了。

您注意到101行的条件判断结果为false,这意味着不会执行104行的操作。这表明在数据发送之前,您的代码可能已经通过其他途径将数据发送给了前端,而不是通过这个if条件。

关于数据如何从后端发送到前端,您需要检查代码的其他部分以确定实际的数据发送位置。可能的情况是,在AppointSending方法之前或之后的某个地方执行了数据发送的操作。

要在前端的 JavaScript 或 HTML 文件中接收这个数据,您需要查找与 WebSocket 相关的代码。WebSocket 是一种在客户端和服务器之间实现双向通信的协议。您可以搜索 WebSocket 相关的 JavaScript 方法或事件,例如WebSocket.onmessage事件,它会在接收到服务器发送的消息时触发。

综上所述,您应该仔细检查代码的其他部分,查找实际的数据发送位置,并在前端的 JavaScript 或 HTML 文件中搜索 WebSocket 相关的代码以接收这个数据。

该回答引用ChatGPT4与博主@晓码自在合作编写:

从代码和描述可以分析出:

  1. 调用AppointSending方法时,消息实际上已经发送到前端了。因为在92行就已经出现在前端页面上了。
  2. 101行的if判断条件为false,不会执行104行的发送操作。这说明消息发送是在方法调用时自动完成的。
  3. 消息的发送和接收是通过WebSocket完成的。WebSocket是一种网络通信协议,支持全双工通信,允许服务器主动发送消息给客户端。
  4. 前端使用JavaScript的WebSocket API来接收服务器发送的消息。

所以,这个方法的发送操作是通过WebSocket自动完成的,一旦调用这个方法,消息就通过WebSocket发送到前端,前端的WebSocket会自动接收和回调处理。

前端接收消息的代码示例如下:

js
let ws = new WebSocket("ws://localhost:8080/websocket");

ws.onopen = () => {
  console.log("WebSocket连接已打开!");
}

ws.onmessage = (e) => {
  console.log(e.data);  //接收从服务器发送的数据 
}
 
ws.onmessage回调会在接收到消息时自动调用,并传入消息数据。

所以,总结来说:

  1. 这个AppointSending方法调用时,消息通过WebSocket自动发送到前端。
  2. 前端通过WebSocket API建立连接,并在onmessage回调中接收消息数据。
  3. 该方法内104行的发送操作由于WebSocket的自动发送而没有执行。

WebSocket使得客户端和服务器之间可以实现全双工通信,服务器可以主动向客户端推送消息,这也是这段代码可以实现自动发送的原理。

你贴出来的代码不完整,但是发送数据到前端是需要调用sendText()这个方法的。

从你截图的代码来看104行确实应该是发送信息的代码,至于你说的代码执行到92行,数据就在前端渲染了出来,可能原因如下:
1.除了这个方法还调用了别的方法发送数据到前端
2.你在前端看到的数据是旧数据,不是后端传递给前端的数据

据您的描述和代码,可以看出这是一个基于Java的WebSocket服务端程序。WebSocket是一种全双工通信协议,可以让客户端和服务端之间实现实时通信。

在WebSocket中,客户端和服务端都可以发送和接收消息。当客户端发送消息到服务端时,服务端会接收到消息,并可以将消息发送给其他客户端。在这个AppointSending方法中,就是将服务端接收到的消息发送给指定的客户端。

至于您的问题,数据是如何从后端发送到前端的,这是由WebSocket协议实现的。当客户端和服务端建立WebSocket连接后,客户端可以通过WebSocket发送消息到服务端,服务端也可以通过WebSocket发送消息到客户端。在这个例子中,当服务端执行到104行时,就是发送消息到客户端的操作。

在前端的js或html文件里面,需要使用WebSocket API来接收服务端发送的消息。在JavaScript中,可以使用WebSocket对象的onmessage事件来接收消息。以下是一个示例代码:

javascript
Copy
var ws = new WebSocket("ws://localhost:8080/websocket");

ws.onmessage = function(event) {
// 接收到服务端发送的消息
  var message = event.data;
  console.log("Received message: " + message);
};

在上面的代码中,创建了一个WebSocket对象,并指定了WebSocket服务端的地址。然后,在WebSocket对象的onmessage事件中,实现接收服务端发送的消息的逻辑。当服务端发送消息到客户端时,就会触发这个事件,并将消息作为event.data参数传递给回调函数。

 // 向指定客户端推送消息
    public static void sendMessage(Session session, String message) {
        try {
            log.info("向sid为:{},发送:{}", session.getId(), message);
            session.getBasicRemote().sendText(message);
        } catch (IOException e) {
            LogTools.err(e);
        }
    }

F12 打开谷歌浏览器调试工具 WS 选项查看前端接受到socket链接 及 消息

img


@Slf4j
@Component
@ServerEndpoint("/websocket/{sessionId}")
public class ProjectConsoleWs {
    public static ProjectConsoleWs service = new ProjectConsoleWs();
    /**
     * 存放所有在线的客户端 [sessionId, session]
     */
    private static final Map<String, Session> clients = new ConcurrentHashMap<>();
 
    public void sendMessage(String sessionId, String message) {
        if (!clients.containsKey(sessionId)) {
            log.error("未找到指定客户端{}的websocket连接!", sessionId);
            return;
        }
 
        this.onMessage(message, clients.get(sessionId));
        log.info("准备向客户端程序{}发送消息:{}", sessionId, message);
    }
 
    @OnMessage
    public void onMessage(String message, Session session) {
        try {
            session.getBasicRemote().sendText(message);
        } catch (IOException e) {
            log.error("消息发送失败!", e);
        }
    }
 
    @OnOpen
    public void onOpen(@PathParam("sessionId") String sessionId, Session session) {
        if (clients.containsKey(sessionId)) {
            log.warn("客户端程序{}已有连接,无需建立连接", sessionId);
            return;
        }
        session.setMaxIdleTimeout(0);
        clients.put(sessionId, session);
        log.info("客户端程序{}建立连接成功!------>当前在线人数为:{}", sessionId,getOnlineCount());
    }
 
    @OnClose
    public void onClose(@PathParam("sessionId") String sessionId, Session session) {
        if (!clients.containsKey(sessionId)) {
            log.warn("客户端程序{}没有连接,无需断开连接", sessionId);
            return;
        }
 
        clients.remove(sessionId);
        log.info("客户端程序{}断开连接成功!------>当前在线人数为:{}", sessionId,getOnlineCount());
    }
 
    @OnError
    public void onError(Session session, Throwable throwable) {
        log.info("连接{}发生错误!", session.getId());
        throwable.printStackTrace();
    }
 
    public boolean sessionIsOpen(String sessionId){
        return clients.get(sessionId).isOpen();
    }
 
    public synchronized int getOnlineCount(){
        return clients.size();
    }
 
}

在 92 行能看到数据的原因是appointSending 方法返回的是一个字符串,而在 onmessage 方法中,收到的 WebSocket 消息会被调用这个 appointSending 方法解析成字符串后直接打印在控制台中。
前端代码接收数据的问题,需要在你的前端代码中实现一个 WebSocket 客户端来与后端的 WebSocket 通信。当 WebSocket 连接建立成功后,在前端代码中可以调用 WebSocket 的 onmessage 方法来接收来自服务端的消息,并且通过 innerHTML 或 innerText 等属性将收到的消息展示在网页上。接收到数据之后,前端代码就可以对其进行处理或展示。