如果这是一个服务器到服务器的连接,并且你只是建立一个socket.io连接(而不是为常规的HTTP连接设置它),那么这段代码只显示了一个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);
});
});
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应用程序,他们可以相互交谈,都可以看到连接和断开事件。
一些解释
的socket.io协议通过使HTTP连接到HTTP服务器发起。所以,只要你有一个socket.io连接,就有一个HTTP服务器在某个地方监听。该HTTP连接最初是通过一些特殊的头文件发送的,这些头文件向服务器表明这是一个“升级”到webSocket协议的请求,并且包含一些额外的安全信息。
这是关于如何初始建立webSocket连接的pretty great reference。它会一步一步告诉你发生了什么。
一旦双方就协议中的“升级”达成一致,则协议切换到webSocket(socket.io然后是基本webSocket协议顶部的附加协议层,但连接全部在HTTP/webSocket级别)。一旦升级达成一致,原来是传入HTTP连接的完全相同的TCP连接将被重新利用,并成为webSocket/socket.io连接。
使用socket.io服务器端库,您可以自己创建HTTP服务器,然后将其传递给socket.io,或者您可以使用socket.io为您创建一个。如果你只使用套接字。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的运输后,你再拥有坐在TCP之上的webSocket格式之上的socket.io数据包格式。
所以理论上我不需要HTTP协议来交换消息。
不,这是不正确的。所有连接最初都是使用HTTP建立的。一旦升级发生在webSocket传输中,就不再使用HTTP了。
这是Coffeescript ... – Matheus208