socket通信的三种实现方式
三种 socket 的实现方式
nodejs 下的 socket
服务端代码
const net = require('net')
const server = net.createServer()
// 存储客户端对象
let clients = {}
let clentName = 0
server
.on('connection', client => {
client.name = ++clentName
clients[client.name] = client
client
.on('data', msg => {
// 接受到客户端数据 广播数据
broadcast(client, msg)
})
})
.listen(3000);
function broadcast(client, msg) {
for (let name in clients) { //向每个在线的客户端广播数据
clients[name].write(client.name + " says: " + msg) //发送数据使用 write 方法
}
}
客户端代码
const net = require('net')
const socket = new net.Socket()
socket
.connect(3000, 'localhost', () => {
socket.write('hello1') //使用 write 方法发送消息
})
.on('data', msg => { //接收服务端消息
console.log(msg.toString());
})
WebSocket
服务端代码
const Ws = require('ws')
const ws = new Ws.Server({ //设置服务器地址
port: 3000,
host: 'localhost'
})
let clients = {}
let clientName = 0
ws.on('connection', client => {
client.name = ++clientName
clients[client.name] = client
client.on('message', msg => { //监听 message 事件
broadcast(client, msg)
})
})
function broadcast(client, msg) {
for (let name in clients) {
clients[name].send(client.name + ' says: ' + msg) //使用send方法发送消息
}
}
客户端代码
const Ws = require('ws') // ie10+ 自带 WebSocket 对象
const ws = new Ws('ws://localhost:3000') //设置请求地址 scheme 为 ws
ws
.on('open', () => { //连接成功
ws.send('hello1') //使用 send 方法向服务端发送消息
})
.on('message', msg => { //监听 message 事件接收服务端消息
console.log(msg);
})
socket.io
服务端代码
const path = require('path')
const ejs = require('ejs')
const http = require('http')
const express = require('express')
const IO = require('socket.io')
const app = express()
const server = http.createServer(app)
const io = IO(server)
io
.on('connection', socket => { // 有客户端接入
console.log('a user connected');
socket
.on('disconnect', () => {
console.log('a user disconnect');
})
.on('chat message', msg => { // 接收客户端消息 可自定义事件名
console.log('msg:', msg.toString());
io.emit('chat message', msg) // 向所有客户端发送消息
// socket.broadcast.emit('chat message', msg) // 向除此 socket 外的所有客户端广播消息
})
})
app
// 设置模版引擎
.set('views', path.join(__dirname, './view'))
.engine('html', ejs.renderFile)
.set('view engine', 'html')
// 渲染页面
.use('/', require('./router/view'))
server
// 设置服务器地址
.listen(3000)
客户端代码
let socket = io() // 创建 socket 对象 需引入 socket.io.js
$('button').on('click',()=>{
socket.emit('chat message', $('#m').val())//发送消息
$('#m').val('')
})
socket
.on('chat message', msg=>{ //接收客户端广播消息
console.log(msg);
$('#messages').append($('<li>').text(msg))
})
三种实现方式的比较
nodejs 下的 socket
需引入 nodejs 自带的 net 模块,浏览器端不可以直接使用WebSocket
大部分浏览器可直接使用,但 ie9 及其以下不兼容socket.io
可在浏览器使用,且兼容大部分浏览器,需引入 socket.io.js 文件
socket通信的三种实现方式的更多相关文章
- 不同vlan间通信的三种配置方式
1.单臂路由(图) 环境:一台路由器,一台二层交换机,两台pc机 二层交换机的配置 //创建vlan 和 vlan : Switch(config)#vlan Switch(config-vlan)# ...
- 并发编程系列小结(线程安全,synchronized,脏读,线程间的通信wait/notify,线程的三种实现方式Demo,可替代wait/notify的方法)
线程安全: 当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法就是线程安全的) synchronized: 可以在任意对象或方法上加锁,而加锁的这段代码称为 ...
- linux学习之centos(二):虚拟网络三种连接方式和SecureCRT的使用
---操作环境--- 虚拟机版本:VMware Workstation_10.0.3 Linux系统版本:CentOS_6.5(64位) 物理机系统版本:win10 一.虚拟网络三种连接方式 当在V ...
- VMware三种链接方式
VMware三种链接方式 第一种:桥接Bridged 如其的说明:connected directly to the physical networkà直接连接到物理网络.如果是通过路由器连接出来的D ...
- Service组件 总结 + 绑定理Service三种实现方式 Messager + Binder + AIDL
在Android中进程按优先级可以分为五类,优先级从高到低排列: - 前台进程 该进程包含正在与用户进行交互的界面组件,比如一个Activity - 可视进程 该进程中的组件虽然没有和用户交互,但是仍 ...
- Java之线程安全中的三种同步方式
一个程序在运行起来时,会转换为进程,通常含有多个线程. 通常情况下,一个进程中的比较耗时的操作(如长循环.文件上传下载.网络资源获取等),往往会采用多线程来解决. 比如,现实生活中,银行取钱问题.火车 ...
- NBIoT三种部署方式【转】
转自:https://472880.kuaizhan.com/89/34/p441944286fccf2 本文作者:吴老司撩通信 本文来源:EETOP NB-IoT支持在频段内(In-Band).保护 ...
- SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 SignalR 简单示例 通过三个DEMO学会SignalR的三种实现方式 SignalR推送框架两个项目永久连接通讯使用 SignalR 集线器简单实例2 用SignalR创建实时永久长连接异步网络应用程序
SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 异常汇总:http://www ...
- Linux基石【第二篇】虚拟网络三种连接方式(转载)
在虚拟机上安装完Centos系统后,开始配置静态IP,以方便在本宿主机上可以访问虚拟机,在曲折的配置中,了解到虚拟机还有三种连接方式:Bridged,NAT和Host-only,于是,我又一轮新的各种 ...
随机推荐
- 在MFC下绘制直线,使用橡皮筋技术,可以使直线效果跟随鼠标移
void CGraphic1View::OnMouseMove(UINT nFlags, CPoint point) { if(MK_LBUTTON == nFlags) { ...
- C# 获取枚举的描述Description
方法类: public static class EnumExtensions { #region Enum /// <summary> /// 获取枚举变量值的 Description ...
- Python之浅谈基础
执行python的两种方式 交互式(jupyter) 通过cmd或jupyter运行python代码 优点:运行一句执行一句 缺点:关闭cmd或jupyter后数据消失 命令行式(pycharm) 优 ...
- 什么是EL表达式?
1.什么是EL表达式? EL(Expression Language) 是为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简 ...
- Golang从合并链表聊递归
从合并链表聊递归 递归是工程师最常见的一种解决问题的方式,但是有时候不容易真正掌握.有人说是看起来很简单,自己写起来会费点劲. 最著名的例子就是斐波那契数列(Fibonacci sequence),通 ...
- 隐写术工具之binwalk
0x00Binwalk介绍 Binwalk是用于搜索给定二进制镜像文件以获取嵌入的文件和代码的工具. 具体来说,它被设计用于识别嵌入固件镜像内的文件和代码. Binwalk使用libmagic库,因此 ...
- Howdoo 纳入华为生态系统
原文链接:https://howdoo.io/howdoo-and-huawei-appgallery/ 重点摘要: 我们是华为设备的忠实粉丝,因此我们非常高兴地宣布,我们一直在积极讨论如何开发 Ho ...
- Creator填色游戏的一种实现方案
前言 先上一个辛苦弄出来的gif效果.写公众号时间不长,很多技巧还在慢慢跟小伙伴学习.可关注公众号,回复"绘图"或者"填色"都可获得demo的git地址.请使用 ...
- Tomcat 架构原理解析到架构设计借鉴
Tomcat 发展这么多年,已经比较成熟稳定.在如今『追新求快』的时代,Tomcat 作为 Java Web 开发必备的工具似乎变成了『熟悉的陌生人』,难道说如今就没有必要深入学习它了么?学习它我们又 ...
- 【题解】uva1104 chips challenge
原题传送门 题目分析 给定一张n*n的芯片. '.'表示该格子可以放一个零件. 'C'表示该格子已经放了一个零件(不能拆下). '/'表示该格子不能放零件. 要求在芯片的现有基础上,放置尽可能多的零件 ...