当前位置: 首页 > 知识库问答 >
问题:

为什么没有一种连接和发送websocket的方法?

弓温书
2023-03-14

我是新的WebSocket,参考下面的Spring WebSocket教程,它在我的系统中工作正常。我也在用stomp.js和sockjs-0.3.4.js.

https://spring.io/guides/gs/messaging-stomp-websocket/

如果html和javascript有如下两种不同的方法,它就可以工作。

function connect() {
    var socket = new SockJS('/app/hello');
    stompClient = Stomp.over(socket);            
    stompClient.connect({}, function(frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/topic/greetings', function(greeting) {
            //showGreeting(greeting);
            showGreeting(JSON.parse(greeting.body).content);
        });
    });
}

function sendName() {
    var name = document.getElementById('name').value;
    stompClient.send("/app/hello", {}, JSON.stringify({ 'name': name }));
}

如果我像下面给出的那样编写一个javascript函数,它将不工作,并将错误作为未捕获错误:INVALID_STATE_ERR。

function startAndSend() {
            connect();
            sendName();
        }

我想知道为什么它不起作用。这可能是一个愚蠢的问题,请在这方面帮助我。我在下面提供了完整的html文件。是否总是需要编写用于连接的html按钮并将信息发送到WebSocket,如Spring WebSocket示例中所示?是不是不可能点击一个按钮,它将连接和发送信息到webSocket?这对我来说似乎很奇怪,我需要你的帮助。

<!DOCTYPE html>
<html>
<head>
<title>Hello WebSocket</title>
<script src="sockjs-0.3.4.js"></script>
<script src="stomp.js"></script>
<script type="text/javascript">
        var stompClient = null;

        function setConnected(connected) {
            document.getElementById('response').innerHTML = '';
        }

        function connect() {
            var socket = new SockJS('/app/hello');
            stompClient = Stomp.over(socket);            
            stompClient.connect({}, function(frame) {
                setConnected(true);
                console.log('Connected: ' + frame);
                stompClient.subscribe('/topic/greetings', function(greeting) {
                    //showGreeting(greeting);
                    showGreeting(JSON.parse(greeting.body).content);
                });
            });
        }

        function disconnect() {
            if (stompClient != null) {
                stompClient.disconnect();
            }
            setConnected(false);
            console.log("Disconnected");
        }

        function sendName() {
            var name = document.getElementById('name').value;
            stompClient.send("/app/hello", {}, JSON.stringify({ 'name': name }));
        }

        function showGreeting(message) {
            var response = document.getElementById('response');
            var p = document.createElement('p');
            p.style.wordWrap = 'break-word';
            console.log(message);
            p.appendChild(document.createTextNode(message));
            response.appendChild(p);
        }


        //Does not work
        function startAndSend() {
            connect();
            sendName();
        }
    </script>

</head>
<body>
    <noscript>
        <h2 style="color: #ff0000">Seems your browser doesn't support
            Javascript! Websocket relies on Javascript being enabled. Please
            enable Javascript and reload this page!</h2>
    </noscript>
    <div>
        Stomp Over Websocket using Spring
        <div>
            <button id="connect" onclick="connect();">Connect</button>
            <button id="disconnect" disabled="disabled" onclick="disconnect();">Disconnect</button>
            <button id="check" onclick="startAndSend();">StartAndSend</button>
        </div>
        <div id="conversationDiv">
            <label>What is your name?</label><input type="text" id="name" />
            <button id="sendName" onclick="sendName();">Send</button>
            <p id="response"></p>
        </div>

    </div>
</body>
</html>

共有2个答案

侯涵煦
2023-03-14

不熟悉Stomp(所以只是一个疯狂的猜测):实际的StompClient.connect调用将回调作为第二个参数。这表明这是异步运行的。使用连接的尝试随后失败,因为它是在连接实际建立之前执行的。尝试一下当您将调用放入连接函数的回调时会发生什么。

蒋烨然
2023-03-14

这是因为stumpClient.connect()方法是异步的,并且在连接尚未建立之后调用sendName()

你应该调用sendName()中的stumpClient.connect()回调,以确保连接在调用sendName()时建立。

例如:

function connect() {
    var socket = new SockJS('/app/hello');
    stompClient = Stomp.over(socket);            
    stompClient.connect({}, function(frame) {
        setConnected(true);
        sendName();
        console.log('Connected: ' + frame);
        stompClient.subscribe('/topic/greetings', function(greeting) {
            //showGreeting(greeting);
            showGreeting(JSON.parse(greeting.body).content);
        });
    });
}
 类似资料:
  • 通常在服务器发送一些数据时发生Message事件。服务器发送到客户端的消息可以包括纯文本消息,二进制数据或图像。无论何时发送数据,都会触发函数。 此事件充当客户端对服务器的耳朵。每当服务器发送数据时,都会触发事件。 以下代码段描述了打开Web Socket协议的连接。 还需要考虑使用Web套接字可以传输哪些类型的数据。Web套接字协议支持文本和二进制数据。就Javascript而言,文本指的是字符

  • ap.sendSocketMessage(OPTION, CALLBACK) 通过 WebSocket 连接发送数据,需要先 ap.connectSocket,并在 ap.onSocketOpen 回调之后才能发送。 OPTION 参数说明 名称 类型 必选 描述 data String/ArrayBuffer 否 请求的参数 代码示例 <script src="https://gw.alipay

  • 我有一个SpringBoot应用程序,它实现了一个Websocket服务器(SockJS)。 我可以在本地网络上将客户端连接到该服务器,只要托管该应用程序的Ubuntu机器可以访问互联网。 2016-10-27 11:22:20.802调试9390---[nio-8085-exec-9]o.a.coyote.http11.org.apache.tomcat.util.net.NioEndpoint

  • 问题内容: 例如,如果python脚本将在运行脚本后吐出一个字符串,提供我要立即编辑的新编写文件的路径,那么将其直接发送到系统剪贴板而不是会很好。 问题答案: 您可以使用外部程序: 使用,您可以设置要使用的剪贴板。 与选择一起使用。那是中键。 与选择一起使用。我不知道是否再使用了。 与选择一起使用。那是你的。 在这里和这里阅读有关X剪贴板的更多信息。 我创建的一个快速而肮脏的函数来处理此问题: 您

  • 我正在尝试从火币 USDT 掉期流式传输比特币价格,但我的乒乓机制不起作用,所以火币总是在 30 秒后关闭连接。 文档是这么说的https://huobiapi . github . io/docs/usdt _ swap/v1/en/# market-heart beat: WebSocket API支持双向心跳。服务器和客户端都可以发送ping消息,对方可以返回pong消息。 WebSocke