三种 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通信的三种实现方式的更多相关文章

  1. 不同vlan间通信的三种配置方式

    1.单臂路由(图) 环境:一台路由器,一台二层交换机,两台pc机 二层交换机的配置 //创建vlan 和 vlan : Switch(config)#vlan Switch(config-vlan)# ...

  2. 并发编程系列小结(线程安全,synchronized,脏读,线程间的通信wait/notify,线程的三种实现方式Demo,可替代wait/notify的方法)

    线程安全: 当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法就是线程安全的) synchronized: 可以在任意对象或方法上加锁,而加锁的这段代码称为 ...

  3. linux学习之centos(二):虚拟网络三种连接方式和SecureCRT的使用

    ---操作环境--- 虚拟机版本:VMware Workstation_10.0.3 Linux系统版本:CentOS_6.5(64位) 物理机系统版本:win10  一.虚拟网络三种连接方式 当在V ...

  4. VMware三种链接方式

    VMware三种链接方式 第一种:桥接Bridged 如其的说明:connected directly to the physical networkà直接连接到物理网络.如果是通过路由器连接出来的D ...

  5. Service组件 总结 + 绑定理Service三种实现方式 Messager + Binder + AIDL

    在Android中进程按优先级可以分为五类,优先级从高到低排列: - 前台进程 该进程包含正在与用户进行交互的界面组件,比如一个Activity - 可视进程 该进程中的组件虽然没有和用户交互,但是仍 ...

  6. Java之线程安全中的三种同步方式

    一个程序在运行起来时,会转换为进程,通常含有多个线程. 通常情况下,一个进程中的比较耗时的操作(如长循环.文件上传下载.网络资源获取等),往往会采用多线程来解决. 比如,现实生活中,银行取钱问题.火车 ...

  7. NBIoT三种部署方式【转】

    转自:https://472880.kuaizhan.com/89/34/p441944286fccf2 本文作者:吴老司撩通信 本文来源:EETOP NB-IoT支持在频段内(In-Band).保护 ...

  8. 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 ...

  9. Linux基石【第二篇】虚拟网络三种连接方式(转载)

    在虚拟机上安装完Centos系统后,开始配置静态IP,以方便在本宿主机上可以访问虚拟机,在曲折的配置中,了解到虚拟机还有三种连接方式:Bridged,NAT和Host-only,于是,我又一轮新的各种 ...

随机推荐

  1. mpvue实战-手势滑动导航栏

    写点东西记录一下美好时光,上周学习了一下通过mpuve开发微信小程序,看完文档,就准备撸起袖子加油干的时候,一开始就被支持手势滑动的导航栏给搞懵逼了.求助一波百度和谷歌未果后,只能自己动脑动手!为了给 ...

  2. DTD约束和Schema约束

    DTD约束 什么是DTD? DTD(Document Type Definition),文档类型定义,用来约束XML文档.规定XML文档中元素的名称,子元素的名称及顺序,元素的属性等. DTD约束长什 ...

  3. 本地连接虚拟机db2V10.5遇到的问题

    在连接虚拟机数据库时发现自己不知道db2的端口号是多少,百度上说50000,60000的都有,所以还是决定自己试一下,并记录下这个过程 # 首先切换到db2inst1的用户 su - db2inst1 ...

  4. 如何使用CSS创建巧妙的动画提示框

    当你的用户需要一些额外的上下文来放置图标,或者当他们需要一些保证来点击按钮,或者可能是一个复活节彩蛋的标题来搭配一个图片时,工具提示是一个很好的方法来增强用户界面.现在让我们来制作一些动画工具提示,只 ...

  5. 带你认识网站图片img懒加载和预加载的区别

    懒加载 什么是懒加载? 懒加载也就是延迟加载.当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次,俗称占位图),只有当图片出现在浏览 ...

  6. if与switch(break穿透)

    ## if与switch(分支语句) ### 一.if...else if...else1.语法 if(条件表达式1){ 语句体1; }else if(条件表达式2){ 语句体2; }else{ 语句 ...

  7. windows jenkins下配置sonar-scanner

    windows jenkins下配置sonar-scanner 一.基本配置信息 ① jenkins版本:2.222.4 ② sonarqube scanner版本:4.4.0.2170 ③ 操作系统 ...

  8. 脱壳实践之寻找OEP——两次内存断点法

      0x00 前言 对于加壳程序第一件事就是要找到OEP(oringinal Entry point),由于加壳的缘故,当PE文件载入OD或者其他调试软件时进入的的往往是壳程序的入口地址.所以要进行逆 ...

  9. Android/iOS内嵌Unity开发示例

    Unity 与 Android/iOS 交叉开发主要有两种方式,以 Android 为例,一是 Android 生成 jar 或者 aar 包,导入到 unity3d plugin/bin/ 目录下: ...

  10. 三种存储方式DAS、NAS、SAN

    ------------恢复内容开始------------ 一.DAS.NAS.SAN在存储领域的位置 随着主机.磁盘.网络等技术的发展,数据存储的方式和架构也在一直不停改变,本文主要介绍目前主流的 ...