我正在尝试使用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协议来交换消息。
答案 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。