- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 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
开始,“Listening on”出现。
如果我运行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 协议(protocol)来交易消息。
最佳答案
如果这是服务器到服务器的连接,并且您仅建立一个 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 应用程序,它们可以相互通信,并且都可以看到连接和断开连接事件。
一些解释
socket.io 协议(protocol)是通过与 HTTP 服务器建立 HTTP 连接来启动的。因此,只要有一个 socket.io 连接,就会有一个 HTTP 服务器在某处监听。该 HTTP 连接最初发送时带有一些特殊的 header ,这些 header 向服务器表明这是“升级”到 webSocket 协议(protocol)的请求,并且还包含一些附加的安全信息。
这是pretty great reference关于 webSocket 连接是如何最初建立的。它将逐步向您展示发生的情况。
一旦双方就协议(protocol)“升级”达成一致,协议(protocol)就会切换到 webSocket(socket.io 是基础 webSocket 协议(protocol)之上的附加协议(protocol)层,但连接都是在 HTTP/webSocket 级别建立的)。一旦升级达成一致,与最初传入 HTTP 连接完全相同的 TCP 连接将被重新调整用途,并成为 webSocket/socket.io 连接。
使用socket.io服务器端库,您可以自己创建HTTP服务器,然后将其传递给socket.io,也可以让socket.io为您创建一个。如果您仅在此服务器上使用 socket.io,并且不使用 http 服务器共享常规 http 请求,那么您可以选择任何一种方式。上面的最小代码示例只是让socket.io 透明地为您创建http 服务器,然后socket.io 绑定(bind)到它。如果您还从 http 服务器发送常规 Web 请求,那么您通常会首先创建 http 服务器,然后将其传递给 socket.io,以便 socket.io 可以绑定(bind)到您已有的 http 服务器。
然后,请记住,socket.io 使用的是 webSocket 传输。它只是 webSocket 传输之上的一些附加数据包结构。这类似于同意通过 HTTP 连接发送 JSON。 HTTP 是主机传输和底层数据格式。然后双方同意将一些数据格式化为 JSON 格式并通过 HTTP 发送。 socket.io 消息格式以这种方式位于 webSocket 之上。
您的问题
Is it necessary to start a HTTP server to use it?
是的,HTTP 服务器必须存在于某处,因为所有 socket.io 连接都是从对 HTTP 服务器的 HTTP 请求开始的。
Sockets are on the transport layer, right?
初始连接协议(protocol)栈的工作原理如下:
TCP <- HTTP protocol
然后,协议(protocol)升级后:
TCP <- webSocket <- socket.io
因此,在协议(protocol)从 HTTP 升级到 webSocket 传输之后,您将拥有位于 TCP 之上的 webSocket 格式之上的 socket.io 数据包格式。
So in theory I don't need a HTTP protocol to trade messages.
不,这是不正确的。所有连接最初都是通过 HTTP 建立的。一旦 webSocket 传输升级,HTTP 将不再使用。
关于node.js - Socket.io 连接事件未在服务器上触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36243444/
我正在尝试将 WPF CodeBehid 事件(如 Event、Handler、EventSetter)转换为 MVVM 模式。我不允许使用 System.Windows.Controls,因为我使用
我可能误解了 Backbone 中的事件系统,但是当我尝试以下代码时什么也没有发生。当我向 Backbone.Events 扩展对象添加新属性时,它不应该触发某种更改、更新或重置事件吗?就像模型一样吗
我遇到了一个简单的问题,就是无法弄清楚为什么它不起作用。我有一个子组件“app-buttons”,其中我有一个输入字段,我想听,所以我可以根据输入值过滤列表。 如果我将输入放在我有列表的根组件中,一切
System.Timers.Timer 的 Elapsed 事件实际上与 System.Windows.Forms.Timer 的 Tick 事件相同吗? 在特定情况下使用其中一种比使用另一种有优势吗
嗨,这个 javascript 代码段是什么意思。(evt) 部分是如此令人困惑.. evt 不是 bool 值。这个怎么运作? function checkIt(evt) { evt
我正在使用jquery full calendar我试图在事件被删除时保存它。 $('calendar').fullCalendar ({
我有两个链接的鼠标事件: $('body > form').on("mousedown", function(e){ //Do stuff }).on("mouseup", function(
这是我的代码: $( '#Example' ).on( "keypress", function( keyEvent ) { if ( keyEvent.which != 44 ) {
我尝试了 dragOver 事件处理程序,但它没有正常工作。 我正在研究钢琴,我希望能够弹奏音符,即使那个键上没有发生鼠标按下。 是否有事件处理程序? 下面是我正在制作的钢琴的图片。 最佳答案 您应该
当悬停在相邻文本上时,我需要使隐藏按钮可见。这是通过 onMouseEnter 和 onMouseLeave 事件完成的。但是当点击另外的文本时,我需要使按钮完全可见并停止 onMouseLeave
我有ul标签内 div标签。我申请了mouseup事件 div标记和 click事件 ul标签。 问题 每当我点击 ul标签,然后都是 mouseup和 click事件被触发。 我想要的是当我点击 u
我是 Javascript 和 jQuery 的新手,所以我有一个非常愚蠢的疑问,请耐心等待 $(document).click(function () { alert("!"); v
我有一个邮政编码解析器,我正在使用 keyup 事件处理程序来跟踪输入长度何时达到 5,然后查询服务器以解析邮政编码。但是我想防止脚本被不必要地调用,所以我想知道是否有一种方法可以跟踪 keydown
使用事件 API,我有以下代码来发布带有事件照片的事件 $facebook = new Facebook(array( "appId" => "XXX", "se
首次加载 Microsoft Word 时,既不会触发 NewDocument 事件也不会触发 DocumentOpen 事件。当 Word 实例已打开并打开新文档或现有文档时,这些事件会正常触发。
我发现了很多相关问题(这里和其他地方),但还没有具体找到这个问题。 我正在尝试监听箭头键 (37-40) 的按键事件,但是当以特定顺序使用箭头键时,后续箭头不会生成“按键”事件。 例子: http:/
给定的 HTML: 和 JavaScript 的: var $test = $('#test'); $test.on('keydown', function(event) { if (eve
我是 Node.js 的新手,希望使用流运行程序。对于其他程序,我必须同时启动一个服务器(mongodb、redis 等),但我不知道我是否应该用这个运行一个服务器。请让我知道我哪里出了问题以及如何纠
我正在尝试使用 Swift 和 Cocoa 创建一个适用于 OS X 的应用程序。我希望应用程序能够响应关键事件,而不将焦点放在文本字段上/文本字段中。我在 Xcode 中创建了一个带有 Storyb
我有以下代码: (function(w,d,s,l,i){ w[l]=w[l]||[];w[l].push({
我是一名优秀的程序员,十分优秀!