簡體   English   中英

嘗試使用socket.io時出現錯誤

[英]getting an error when trying to use socket.io

我目前正在使用socket.io swift客戶端。 在Iphone SE上運行。 這是快速代碼

 let socket = SocketIOClient(socketURL: URL(string: "http://example.com:4000")!, config: [.log(true), .forcePolling(true)]);
        socket.connect();
        socket.on("connect") {data, ack in
            print("socket is connected");
            socket.emit("getData", ["data": 3]);
        }

在服務器上:

var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);

io.on('connection', function(socket){
    console.log('a user connected');
    socket.on('disconnect', function(){
        console.log('user disconnected');
    });
    socket.on('getData', function(result){
        console.log(result);
    });
});


app.listen(4000, function () {
  console.log(' on at 4000!');
});

...然后在Xcode控制台上,我得到

2016-09-29 16:38:33.871895 proj[3070:1019256] LOG SocketEngine: Handshaking
2016-09-29 16:38:33.872301 proj[3070:1019256] LOG SocketEnginePolling: Doing polling request
2016-09-29 16:38:34.004312 proj[3070:1019256] LOG SocketEnginePolling: Got polling response
2016-09-29 16:38:34.004874 proj[3070:1019283] LOG SocketEngine: Got message: Cannot GET /socket.io/?transport=polling&b64=1
2016-09-29 16:38:34.005283 proj[3070:1019283] ERROR SocketIOClient: Got unknown error from server Cannot GET /socket.io/?transport=polling&b64=1

這表明已建立連接並成功找到了服務器,但其他地方有問題。 將不勝感激。

(旁注:如果您不需要舊瀏覽器(或其他任何瀏覽器,因為您的客戶端是本機移動應用程序)的支持,則可以考慮使用WebSocket,這是一種開放標准。Socket.io通常用於不支持WebSocket的瀏覽器上的類似於WebSocket的功能;另一方面,WebSocket是開放標准,具有廣泛的支持(不僅在瀏覽器中)而且性能更好。有關更多詳細信息,請參見此答案 。)

現在,由於您已經在使用Socket.io,因此可以通過以下方法診斷問題。 我將嘗試從瀏覽器進行連接,這是連接Socket.io的主要方法,並查看其是否有效。 如果沒有,那意味着您的服務器代碼有問題。 如果這樣做,則可能意味着您的客戶有問題。 那將是要檢查的第一件事。 從那里可以縮小問題范圍,並有望解決它。

如果您想以使用Socket.io的一些工作代碼作為起點,包括服務器站點(Node.js)和客戶端(瀏覽器原始JavaScript),那么您可以看到我最初為該答案編寫的示例, 在GitHubnpm 上可用

Socket.IO服務器

使用Express.js的Socket.IO服務器示例:

var path = require('path');
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', (req, res) => {
  console.error('express connection');
  res.sendFile(path.join(__dirname, 'si.html'));
});
io.on('connection', s => {
  console.error('socket.io connection');
  for (var t = 0; t < 3; t++)
    setTimeout(() => s.emit('message', 'message from server'), 1000*t);
});
http.listen(3002, () => console.error('listening on http://localhost:3002/'));
console.error('socket.io example');

來源: https : //github.com/rsp/node-websocket-vs-socket.io/blob/master/si.js

Socket.IO客戶端

使用原始JavaScript的Socket.IO客戶端示例:

var l = document.getElementById('l');
var log = function (m) {
    var i = document.createElement('li');
    i.innerText = new Date().toISOString()+' '+m;
    l.appendChild(i);
}
log('opening socket.io connection');
var s = io();
s.on('connect_error', function (m) { log("error"); });
s.on('connect', function (m) { log("socket.io connection open"); });
s.on('message', function (m) { log(m); });

來源: https : //github.com/rsp/node-websocket-vs-socket.io/blob/master/si.html

您可以將相同的代碼與WebSocket版本進行比較:

WebSocket服務器

使用Express.js的WebSocket服務器示例:

var path = require('path');
var app = require('express')();
var ws = require('express-ws')(app);
app.get('/', (req, res) => {
  console.error('express connection');
  res.sendFile(path.join(__dirname, 'ws.html'));
});
app.ws('/', (s, req) => {
  console.error('websocket connection');
  for (var t = 0; t < 3; t++)
    setTimeout(() => s.send('message from server', ()=>{}), 1000*t);
});
app.listen(3001, () => console.error('listening on http://localhost:3001/'));
console.error('websocket example');

來源: https : //github.com/rsp/node-websocket-vs-socket.io/blob/master/ws.js

WebSocket客戶端

使用普通JavaScript的WebSocket客戶端示例:

var l = document.getElementById('l');
var log = function (m) {
    var i = document.createElement('li');
    i.innerText = new Date().toISOString()+' '+m;
    l.appendChild(i);
}
log('opening websocket connection');
var s = new WebSocket('ws://'+window.location.host+'/');
s.addEventListener('error', function (m) { log("error"); });
s.addEventListener('open', function (m) { log("websocket connection open"); });
s.addEventListener('message', function (m) { log(m.data); });

來源: https : //github.com/rsp/node-websocket-vs-socket.io/blob/master/ws.html

我希望這可以幫助您評估是使用Socket.io還是使用WebSocket是適合您的正確決定,並會為您提供一些有效的客戶端代碼來測試您的后端。 該代碼是根據MIT許可 (開源,免費軟件)發布的,因此可以在您的項目中隨意使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM