尝试使用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的function。另一方面,WebSocket是一个开放标准,具有广泛的支持(不仅在浏览器中),而且性能更好。有关更多详细信息,请参阅此答案 。)

现在,因为您已经在使用Socket.io,所以这里是您如何诊断问题。 我会尝试从浏览器连接,这是与Socket.io连接的主要方式,看看是否有效。 如果没有则表示服务器代码存在问题。 如果确实如此,则可能意味着您的客户端存在问题。 这将是第一件要检查的事情。 从那里开始你可以缩小问题并希望解决它。

如果你想使用Socket.io,服务器站点(Node.js)和客户端(浏览器vanilla JavaScript)都有一些工作代码的起点,那么你可以看到我最初为这个答案写的例子,可以在GitHub和npm 上找到 :

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客户端

使用vanilla 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客户端

使用vanilla 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许可证 (开源,免费软件) 下发布的 ,因此您可以在项目中使用它。