Socket.io连接事件未在服务器上触发

时间:2016-03-27 03:15:11

标签: node.js coffeescript socket.io

我正在尝试使用Node.js和Socket.io构建命令行聊天室。

到目前为止,这是我的服务器端代码,我已经尝试了这两个http初始化(使用express,就像官方网站的教程一样,没有它):

->

我从#app = require('express')() #http = require('http').Server(app) http = require('http').createServer() io = require('socket.io')(http) io.sockets.on 'connect', (socket) -> console.log 'a user connected' http.listen 3000, () -> console.log 'listening on *:3000' 开始,“倾听”正在显示。

如果我运行nodejs server.js,则会显示server.js进程。

但是,当我启动此客户端代码时:

lsof -i tcp:3000

没有运气......当我运行nodejs client.js时,服务器和客户端的“连接”事件都不会被触发!

我的问题是: - 我究竟做错了什么? - 是否有必要启动HTTP服务器才能使用它?套接字在传输层上,对吧?所以从理论上讲,我不需要HTTP协议来交换消息。

1 个答案:

答案 0 :(得分:0)

如果这是服务器到服务器的连接,并且您只进行了socket.io连接(而不是为常规HTTP连接设置它),则此代码显示了仅用于socket.io连接的简单方法:

侦听socket.io-only服务器

// Load the library and initialize a server on port 3000
// This will create an underlying HTTP server, start it and bind socket.io to it
const io = require('socket.io')(3000);

// listen for incoming client connections and log connect and disconnect events
io.on('connection', function (socket) {
    console.log("socket.io connect: ", socket.id);

    socket.on('disconnect', function() {
        console.log("socket.io disconnect: ", socket.id);
    });
});

Node.js socket.io客户端 - 连接到另一个socket.io服务器

// load the client-side library
const io = require('socket.io-client');
// connect to a server and port
const socket = io('http://localhost:3000');

// listen for successful connection to the server
socket.on('connect', function() {
    console.log("socket.io connection: ", socket.id);
});

此代码适用于我的电脑。我可以在同一主机上运行两个独立的node.js应用程序,它们可以相互通信,并且都可以看到连接和断开事件。

一些解释

通过与HTTP服务器建立HTTP连接来启动socket.io协议。所以,只要你有一个socket.io连接,就会有一个HTTP服务器在某处监听。该HTTP连接最初是通过一些特殊标头发送的,这些标头向服务器表明这是一个请求升级"到webSocket协议和一些额外的安全信息包括在内。

这是关于如何最初建立webSocket连接的pretty great reference。它会一步一步地向您展示会发生什么。

一旦双方同意'#34;升级"在协议中,然后协议切换到webSocket(然后socket.io是基于webSocket协议的附加协议层,但是连接都是在HTTP / webSocket级别建立的)。一旦达成协议升级,原来与传入HTTP连接完全相同的TCP连接将被重新利用并成为webSocket / socket.io连接。

使用socket.io服务器端库,您可以自己创建HTTP服务器,然后将其传递给socket.io,也可以让socket.io为您创建一个。如果您只在此服务器上使用socket.io而不是使用http服务器共享常规http请求,那么您可以采用任何一种方式。上面的最小代码示例,让socket.io透明地为您创建http服务器,然后socket.io绑定到它。如果您还从http服务器部署常规Web请求,那么通常首先创建http服务器然后将其传递给socket.io,以便socket.io可以绑定到您已有的http服务器。

然后,请记住socket.io正在使用webSocket传输。它只是webSocket传输之上的一些额外的数据包结构。它类似于同意通过HTTP连接发送JSON。 HTTP是主机传输和底层数据格式。然后,双方同意以JSON格式格式化一些数据并通过HTTP发送。 socket.io消息格式以这种方式位于webSocket之上。

您的问题

  

是否有必要启动HTTP服务器才能使用它?

是的,HTTP服务器必须存在于某处,因为所有socket.io连接都以对HTTP服务器的HTTP请求开始。

  

套接字在传输层上,对吗?

初始连接协议栈的工作原理如下:

TCP <- HTTP protocol

然后,在协议升级之后:

TCP <- webSocket <- socket.io

因此,在协议从HTTP升级到webSocket传输之后,然后将socket.io数据包格式放在位于TCP顶部的webSocket格式之上。

  

所以从理论上讲,我不需要HTTP协议来交换消息。

不,这不正确。所有连接最初都是使用HTTP建立的。一旦webSocket传输升级,就不再使用HTTP。