使用NodeJS和Socket.IO设置无状态连接

时间:2015-07-05 14:30:43

标签: node.js sockets

使用PHP和Unity3D对我的项目进行原型设计后,我决定使用Cordova和NodeJS构建生产版本。

我目前正在使用Socket.io和NodeJS,并且对连接感到困惑。我期望这样做的方式是以下过程:

  1. 客户端将通过请求连接到服务器
  2. 服务器将响应请求
  3. 连接将关闭
  4. 然而,似乎连接似乎保持打开,如果连接关闭,它会不断尝试重新连接,这不是我想要的。我正在尝试建立单一的数据传输状态,类似于向PHP文件发出Web请求时发生的情况。

    项目的源代码几乎是样板代码:

    var application = require('express')();
    var http = require('http').Server(application);
    var server = require('socket.io')(http);
    
    http.listen(8080, function() {
        console.log('Listening on *:8080');
    });
    
    server.on('connection', function(socket) {
        console.log('SERVER: A new connection has been received.');
        server.on('disconnect', function() {
            console.log('SERVER: A connection has been closed.');
        });
    });
    

    我不需要持久连接,也不需要连接。

    思考:我可以从客户端发送密切握手。例如:

    1. 将一些数据发送到服务器
    2. 从服务器接收一些数据
    3. 向服务器发送关闭请求/只关闭套接字
    4. 套接字关闭后继续应用程序逻辑
    5. 这是处理此问题的正确方法吗?然而问题出现了,如果数据丢失了,那么就会有一个永久打开的套接字。在这种情况下实施基本超时是否理想? (IE:如果在10秒内未收到响应,则表示出现错误或服务器不可用)。

2 个答案:

答案 0 :(得分:0)

不确定为什么要使用socket.io。套接字IO用于不同的目的,并不符合您的标准。我已经看到它主要用于实时应用程序和二进制流。您可以在node.js中尝试TCP套接字

var net = require('net');

var HOST = '127.0.0.1';
var PORT = 6969;

// Create a server instance, and chain the listen function to it
// The function passed to net.createServer() becomes the event handler for the 'connection' event
// The sock object the callback function receives UNIQUE for each connection
net.createServer(function(sock) {

    // We have a connection - a socket object is assigned to the connection automatically
    console.log('CONNECTED: ' + sock.remoteAddress +':'+ sock.remotePort);

    // Add a 'data' event handler to this instance of socket
    sock.on('data', function(data) {

        console.log('DATA ' + sock.remoteAddress + ': ' + data);
        // Write the data back to the socket, the client will receive it as data from the server
        sock.write('You said "' + data + '"');

    });

    // Add a 'close' event handler to this instance of socket
    sock.on('close', function(data) {
        console.log('CLOSED: ' + sock.remoteAddress +' '+ sock.remotePort);
    });

}).listen(PORT, HOST);

console.log('Server listening on ' + HOST +':'+ PORT);

查看here

答案 1 :(得分:0)

然后Socket.io是您的方案的错误工具。 socket.io需要保持套接字打开以将事件从服务器返回到客户端(反之亦然)。事实上,即使服务器不支持WebSockets,socket.io也会诉诸其他机制,例如轮询。