nodejs 如何使用upgrade,并且C/B 发送消息


1 const http = require(‘http‘);
 2 const querystring = require("querystring");
 3 var postData = querystring.stringify({
 4     ‘msg‘: ‘Hello World!‘
 5 });
 6 // Create an HTTP server
 7 var srv = http.createServer((req, res) => {
 8     res.writeHead(200, {‘Content-Type‘: ‘text/plain‘});
 9     res.end(‘okay‘);
10 });
11 srv.on(‘upgrade‘, (req, socket, head) => {
12
13     socket.write(‘HTTP/1.1 101 Web Socket Protocol Handshake\r\n‘ +
14         ‘Upgrade: WebSocket\r\n‘ +
15         ‘Connection: Upgrade\r\n‘ +
16         ‘\r\n‘);
17
18     socket.on("data", (d)=> {
19         console.log(d.toString())
20     });
21     socket.on("end", ()=> {
22         socket.write("发送服务器的消息");
23         socket.end();
24         if (!socket.destroyed) {
25             console.log(" socket.end 会销毁socket,不信你可以执行end,看会不会进入这个方法")
26             if (socket.destroy) {
27                 socket.destroy();
28                 console.log(!socket.destroyed)
29             }
30
31         }
32     });
33 });
34
35 // now that server is running
36 srv.listen(1337, ‘127.0.0.1‘, () => {
37
38     // make a request
39     var options = {
40         port: 1337,
41         hostname: ‘127.0.0.1‘,
42         headers: {
43             ‘Connection‘: ‘Upgrade‘,
44             ‘Upgrade‘: ‘websocket‘
45         }
46     };
47
48     var req = http.request(options);
49     req.on(‘upgrade‘, (res, socket, upgradeHead) => {
50         socket.write(‘发送客户端的消息\r\n‘);
51         socket.end();
52
53         socket.on(‘data‘, (chunk) => {
54             console.log(chunk.toString());
55         });
56         socket.on(‘end‘, () => {
57             console.log("服务器消息接收完毕");
58             console.log("socket已经被销毁",socket.destroyed)
59         });
60
61     });
62
63     req.end();
64
65
66 });

整个流程是

1 :request的 header里加上:

 ‘Connection‘: ‘Upgrade‘,
 ‘Upgrade‘: ‘websocket‘

生成的http.ClientRequest 最后一定要调用end函数,不然服务器会一直等待你消息发送完毕

2: 服务器监听 ‘Upgrade’,然后返回:

‘HTTP/1.1 101 Web Socket Protocol Handshake\r\n‘ +
    ‘Upgrade: WebSocket\r\n‘ +
    ‘Connection: Upgrade\r\n‘ +
   ‘\r\n‘

维基百科里说了,这样叫作握手!

这样的话,Upgrade 就算建立起来了。

3:然后就可以通过socket相互消息了。记住socket.end一旦执行,就会断开这次的tcp链接了。

时间: 2024-10-12 12:55:58

nodejs 如何使用upgrade,并且C/B 发送消息的相关文章

使用WeCloud消息推送接口发送消息NodeJs版

WeCloud是一家初创公司的产品,目前主要在做Android和IOS消息推送这块.他们提供了用于向设备发送消息的协议,具体协议内容见消息推送协议. 这篇文章将使用NodeJs基于这个推送协议完成向App用户推送消息的服务端SDK. 首先你需要注册一个帐号,然后系统会为你自动生成一个测试demo,你可以通过扫二维码或先下载到电脑的方式获得apk文件,再将其安装到自己的手机上之后就可以测试发送效果了,每个应用都会有对应的Appkey和Master Secret这两个属性,它是作为发送消息的凭证而存

kafka无法发送消息问题处理

背景 在服务器上搭建了一个单机环境的kafka broker,在服务器上使用命令生产消息时,一切正常.当在本地使用JAVA程序发送消息时,一直出错. 抛出的错误为: Exception in thread "main" Failed to send requests for topics test with correlation ids in [0,12] kafka.common.FailedToSendMessageException: Failed to send messag

一步一步来做WebQQ机器人-(五)(发送消息||完结)

× 本篇主要是: 发送QQ消息(to:好友,群),以及对小黄鸡抓包利用它的语言库 本文是WebQQ流程的最后一章 最后一章内容不多但我还是啰嗦,可能对大部分人都已知晓的流程方法我也会介绍一下 前面几个demo我已经上传到对应页面的尾部,剩下的会抽时间补,外包经常加班且没外网,尽量本周弄完 目前总进度大概100% 全系列预计会有这些步骤,当然某些步骤可能会合并: 验证码 第一次登陆 第二次登陆 保持在线和接收消息 获取好友和群列表 发送消息 变成智能的(*?∀?*) 回顾基础 一般抓包模拟请求的方

一个按键精灵后台发送消息的脚本

以前,我也用过按键精灵写过一些脚本,那时候经常用这个来挂机FB什么的. 那天,某网友问起,于是就回答了下 无非就是,抓句柄,然后相对定位坐标或者发送消息到固定窗体 代码如下: 1 //////////////////////////抓窗口句柄////////////////////////////////////////// 2 3 Dim Hwnd 4 5 Hwnd = Plugin.Window.MousePoint() 6 7 sWindow = Plugin.Window.IsWindo

MSMQ向远程服务器发送消息错误总结

一:路径错误(Path)错误 如果向远程服务器发送消息,请使用格式名的形式,如: FormatName:Direct=TCP:121.0.0.1\\private$\\queueFormatName:Direct=OS:machinename\\private$\\queuenameFormatName:DIRECT=http://222.10.xx.xx/msmq/Private$/test注意:FontName是区分大小写的.如果表达式为"FORMATNAME:Dire......"

我是企业号体验账户 我发送消息:微信错误 errcode=60011,

http://qydev.weixin.qq.com/qa/index.php?qa=3197&qa_1=%E6%88%91%E6%98%AF%E4%BC%81%E4%B8%9A%E5%8F%B7%E4%BD%93%E9%AA%8C%E8%B4%A6%E6%88%B7-%E6%88%91%E5%8F%91%E9%80%81%E6%B6%88%E6%81%AF%EF%BC%9A%E5%BE%AE%E4%BF%A1%E9%94%99%E8%AF%AF&show=3197#q3197 我是企业号

微信企业号回调模式验证与发送消息

最近放假闲着无聊,研究了一下微信企业号, 打算通过企业号做一个运维报警信息发送的功能,记录自己的操作 第一步 注册企业号,网上一搜一大把的教程,这里略过  微信企业号登录地址  https://qy.weixin.qq.com/ 第二步  登录后 点左侧 应用中心 -新建应用 第三步  在第二步第一图中的自建应用下面找到刚刚新建的应用 拉到最下面有一个模式选择,点击回调模式 会看到下图界面 Token 和EncodingAESKey 点击随机获取即可,上面的url需要你有自己的服务地址  你的服

Winform 程序嵌入WPF程序 并发送消息

废话不多说,先看解决方案目录 WindowsFormsDemo是主程序,WpfApp是嵌入的WPF程序,先看WPF程序,程序默认启动的页面是MainWindow.xaml,这里注释掉App.xaml里的StartupUri="MainWindow.xaml",后台设置启动的Uri,将原来的空的App类改成一些内容(也可以不改) /// <summary> /// App.xaml 的交互逻辑 /// </summary> public partial class

使用DWR长连接技术实现客户端一对一发送消息

关于DWR怎么使用我的上一篇博文里面记录了,这里写一个DWR一对一消息推送的WEB程序,也就是WEB一对一聊天.我的思路是这样的:首先每个用户在登陆后在各自的页面放置一个唯一标记(如用户的ID,也可以放在session里面),用户A向用户B发送的消息 -->服务器 -->JAVA方法-->JAVA方法调用前端所有正在访问聊天页面的JS函数-->JS判断消息发送至的客户端是否是用户B -->是则显示,否则不显示:用户B向A同样过程 首先是该项目的web.xml文件: <?

Android:子线程向UI主线程发送消息

在Android里,UI线程是不允许被阻塞的,因此我们要将耗时的工作放到子线程中去处理. 那么子线程耗时处理后要怎样通知UI线程呢? 我们可以在UI主线程中创建一个handler对象,然后通过重写其handleMessage(Message msg)的方法,该方法会接收到子线程中的handler对象的sendMessage((Message msg)发回来的消息.这样一发一收就完成工作: 而关于主线程向子线程发送消息的内容可以看我的上一篇博客,其中讲到了Looper类及其两个重要方法和实现原理.