2014-11-06 282 views
0

我使用QML的WebSockets組件創建了一個簡單的聊天應用程序。這只是客戶端:QML WebSocket錯誤:不支持的WebSocket方案:http

Window { 
    id: root 
    visible: true 
    width: 1024 
    height: 768 

    property variant messages: [] 

    WebSocket { 
     id: sock 
     url: "http://localhost:3700" 
     onTextMessageReceived: { 
      var data = message; 
      var messages = root.messages; 
      if(data.message) { 
       messages.push(data); 
       var html = ''; 
       for(var i = 0; i < messages.length; i++) { 
        html += '<b>' + (messages[i].username ? messages[i].username : 'Server') + ': </b>'; 
        html += messages[i].message + '<br />'; 
       } 
       messageBox.append(html); 
      } else { 
       messageBox.append("There is a problem:", data); 
      } 
     } 
     onStatusChanged: { 
      if (sock.status == WebSocket.Error) { 
       messageBox.append("Error: " + sock.errorString); 
      } 
      else if (sock.status == WebSocket.Open) { 
       messageBox.append("Socket open"); 
      } 
      else if (sock.status == WebSocket.Closed) { 
       messageBox.append("Socket closed"); 
      } 
     } 
     active: false 
    } 

服務器上的Node.js和Socket.io使用this文章來實現。 問題是,當我嘗試連接到該應用程序將引發此服務器:

Error: Unsupported WebSocket scheme: http

如果我改變協議WS,則服務器關閉連接。我能做什麼?

服務器代碼:

var express = require("express"); 
var app = express(); 
var port = 3700; 

app.set('views', __dirname + '/tpl'); 
app.set('view engine', "jade"); 
app.engine('jade', require('jade').__express); 
app.get("/", function(req, res){ 
    res.render("page"); 
}); 

app.use(express.static(__dirname + '/public')); 

var io = require('socket.io').listen(app.listen(port)); 

io.sockets.on('connection', function (socket) { 
    socket.emit('message', { message: 'welcome to the chat' }); 
    socket.on('send', function (data) { 
     io.sockets.emit('message', data); 
    }); 
}); 

console.log("Listening on port " + port); 
+0

Socket.io!== websockets。 Socket.io首先使用xhr進行連接,然後在支持的情況下升級到websockets。 – 2014-11-06 11:02:46

+0

Socket.io在服務器上,那裏沒有xhr。你的意思是我需要創建一個沒有Socket.io的服務器? – jstice4all 2014-11-06 11:05:17

+0

與socket.io的初始連接需要xhr ...'''''Socket.IO永遠不會假定WebSocket將會工作,因爲在實踐中,它很可能不會。相反,它立即建立與XHR或JSONP的連接,然後嘗試將連接升級到WebSocket.'。 – 2014-11-06 11:06:27

回答

1

從Qt文檔: The url must have one of 2 schemes: ws:// or wss://. When not supplied, then ws:// is used. 所以,你必須指定URL作爲

url: "ws://localhost:3700" 

wss://如果使用安全連接。

還要考慮到QMLWebSocket僅支持WebSocket協議的版本13。 有關更多信息,請參閱RFC documentation