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