2016-03-27 43 views
1

我正尝试使用Node.js和Socket.io构建命令行聊天室。未在服务器上触发Socket.io连接事件

这是我的服务器端代码,到目前为止,我已经与两个HTTP initialisations尝试这(在官方网站上的教程与快递一样,没有它):

#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 ,“聆听”正在显现。

如果我运行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协议来交换消息。

+0

这是Coffeescript ... – Matheus208

回答

0

如果这是一个服务器到服务器的连接,并且你只是建立一个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了。

+0

@ Matheus208 - 这是否回答您的问题?如果是这样,请检查答案左侧的绿色复选标记,以向社区表明您的问题现在已经得到解答,并为遵循正确的程序赢得一些声望点。如果这没有回答你的问题,那么请评论它仍然缺少的东西,这样可以编辑答案来完成它。 – jfriend00

相关问题