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

Node.js 服务器上未触发Socket.io连接事件,node.js,coffeescript,socket.io,Node.js,Coffeescript,Socket.io,我正在尝试使用Node.js和Socket.io构建一个命令行聊天室 这是我的服务器端代码,到目前为止,我已经尝试了两种http初始化(使用express,就像官方网站的教程一样,也没有): 我从nodejs server.js开始,显示“监听” 如果我运行lsof-I tcp:3000,就会显示server.js进程 但是,当我启动此客户端代码时: socket = require('socket.io-client')('localhost:3000', {}) socket.on 'co

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

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

我从nodejs server.js开始,显示“监听”

如果我运行lsof-I tcp:3000,就会显示server.js进程

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

socket = require('socket.io-client')('localhost:3000', {})

socket.on 'connect', (socket) ->
  console.log "Connected"
没有运气。。。当我运行nodejs client.js时,服务器和客户端都不会触发“连接”事件

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

如果这是一个服务器到服务器的连接,而您只建立一个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);
    });
});
// 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 socket.io客户端-连接到另一个socket.io服务器

// 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);
    });
});
// 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连接最初是如何建立的。它会一步一步地告诉你发生了什么

一旦双方就协议中的“升级”达成一致,则该协议将切换到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发送。io消息格式以这种方式位于webSocket之上

您的问题

是否需要启动HTTP服务器才能使用它

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

套接字在传输层上,对吗

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

TCP <- HTTP protocol

TCP如果这是一个服务器到服务器的连接,而您只是建立一个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);
    });
});
// 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 socket.io客户端-连接到另一个socket.io服务器

// 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);
    });
});
// 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连接最初是如何建立的。它会一步一步地告诉你发生了什么

一旦双方就协议中的“升级”达成一致,则该协议将切换到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是usi