我是websocket的新手并且一直在探索spring websocket解决方案,我已经从以下url实现了hello world应用程序:Spring websocket。
我想从nodejs调用服务器,而不是使用index.html页面。这是我对SockJS和Stompjs的实现。
var url = 'http://localhost:8080'
var SockJS = require('sockjs-client'),
Stomp = require('stompjs'),
socket = new SockJS(url + '/hello'),
client = Stomp.over(socket)
function connect(){
client.connect({}, function(frame){
console.log(frame)
client.subscribe(url + '/topic/greetings', function(greeting){
console.log(greeting)
})
})
}
function sendName(){
var name = 'Gideon'
client.send(url + '/app/hello', {}, JSON.stringify({ 'name': name }))
}
function disconnect(){
if(client)
client.disconnect()
}
function start(){
connect()
sendName()
}
start();
我使用node --harmony index.js
这是我在尝试不同网址时遇到的错误:
url :var socket = new SockJS('http://localhost:8080/hello')
Error: InvalidStateError: The connection has not been established yet
url: var socket = new SockJS('/hello')
Error: The URL '/hello' is invalid
url: var socket = new SockJS('ws://localhost:8080/hello')
Error: The URL's scheme must be either 'http:' or 'https:'. '" + parsedUrl.protocol + "' is not allowed.
我的依赖
"dependencies": {
"sockjs-client": "^1.0.3",
"stompjs": "^2.3.3"
}
可在此处找到项目:https://bitbucket.org/gideon_o/spring-websocket-test
答案 0 :(得分:0)
SockJS的预期端点URL是HTTP端点。 SockJS将在使用之前检查WebSocket协议是否可用,或者回退到其他选项(如长轮询)。你的第一个选择是正确的:
var socket = new SockJS('http://localhost:8080/hello')
STOMP客户端连接方法是非阻塞的,这就是为什么提供将在建立连接时执行的回调的原因。您正在尝试在调用connect方法后立即通过该连接发送消息。连接尚未建立(太快),您收到错误消息:
Error: InvalidStateError: The connection has not been established yet
您必须将消息的发送移动到提供给connect方法的回调,以确保它已经建立。这同样适用于订阅(您已在示例中执行此操作)。
还有一点需要注意的是,STOMP目标不是URL。我们无需使用http://localhost:8080
作为目的地的前缀,目的地应该只是/topic/greetings