node模拟socket
什么是Socket?
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
Socket通信流程

基于net模块实现socket
服务端SocketServer.js
var net = require('net')
// 声明一个客户端socket
var client = new net.Socket()
client.setEncoding = 'UTF-8'
// 连接服务器
client.connect(9000, '127.0.0.1', function () {
client.write('您好')
})
// 客户端接收服务端数据
client.on('data', function (data) {
console.log('服务端传来:' + data)
say()
})
// 客户端关闭
client.on('close', function () {
console.log('connection closed');
})
// 定义输入界面
var readline = require('readline')
var r = readline.createInterface({
input: process.stdin,
output: process.stdout
})
function say() {
r.question('请输入:', (inputStr) => {
if (inputStr == 'bye') {
client.destroy()
r.close()
} else {
client.write(inputStr + '\n')
}
})
}
客户端SocketClient.js
var net = require('net')
var chatServer = net.createServer()
// client 对象集合
var clientMap = new Object()
var i = 0
// 创建一个连接
chatServer.on('connection', function (client) {
console.log('客户端有人连接~')
// 用自然数记录用户的名字
client.name = ++i
// 记录client对象
clientMap[client.name] = client
// 获取用户端发送来的数据
client.on('data', function (data) {
console.log('客户端传来:' + data)
broadcast(data, client)
})
// 错误处理
client.on('error', function (err) {
// console.log(err);
client.end()
})
// 客户端关闭处理
client.on('close', function (data) {
delete clientMap[client.name]
broadcast(client.name + '下线了', client)
})
})
// 服务端广播数据给客户端
function broadcast(data, client) {
for (var key in clientMap) {
// 发送数据
clientMap[key].write(client.name + ' 说:' + data + '\n')
}
}
// 监听端口
chatServer.listen(9000)
启动服务端:
node SocketServer.js
使用多个窗口启动客户端:
node SocketClient.js
模拟websocket
服务端
WsServer.js
// 服务创建
var WebsocketServer = require('ws').Server
wss = new WebsocketServer({port: 9000}) var clientMap = new Object()
var i = 0 wss.on('connection', function (ws) {
console.log(ws + '上线了');
ws.name = ++i clientMap[ws.name] = ws // 接收客户数据
ws.on('message', function (msg) {
broadcast(msg, ws)
}) // 客户端关闭监听
ws.on('close', function () {
delete clientMap[ws.name]
console.log(ws.name + '离开');
})
}) function broadcast(msg, ws) {
for (var key in clientMap) {
clientMap[key].send(ws.name + '说' + msg)
}
}
客户端:
WsClient.js
var ws = new WebSocket('ws://127.0.0.1:9000/')
ws.onopen = function () {
ws.send('大家好')
}
ws.onmessage = function (event) {
var chatroom = document.querySelector('#chatroom')
chatroom.innerHTML += '<br />' + event.data
}
ws.onclose = function () {
console.log('Closed');
}
ws.onerror = function (err) {
console.log(err);
}
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
#chatroom {
width: 400px;
height: 300px;
overflow: auto;
border: 1px solid blue;
}
</style>
</head>
<body>
<h1>WebSocket</h1>
<div id="chatroom"></div>
<input type="text" name="sayinput" id="sayinput" value="">
<input type="button" name="send" id="send" value="发送"> <script src="./WsClient.js"></script>
<script>
function send() {
var sayinput = document.querySelector('#sayinput')
ws.send(sayinput.value)
sayinput.value = ''
}
document.querySelector('#send').onclick = function () {
send()
}
document.body.onkeyup = function (event) {
if (event.keyCode == 13) {
send()
}
}
</script>
</body>
</html>
socket.io的使用
SocketIoServer.js
var http = require('http')
var app = http.createServer()
var io = require('socket.io')(app);
app.listen(9001);
io.on('connection', function (socket) {
//socket.name = ++i
//onlineusers[socket.name] = socket
socket.on('my other event', function (data) {
// for (var key in onlineusers) {
// onlineusers[key].emit('news', { msg: data.my })
// }
socket.emit('news', { msg: data.my });
socket.broadcast.emit('news', { msg: data.my });
});
});
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Socket.io</title>
<style>
#chatroom {
width: 400px;
height: 300px;
overflow: auto;
border: 1px solid blue;
}
</style>
</head>
<body>
<h1>Socket.io</h1>
<div id="chatroom"></div>
<input type="text" name="sayinput" id="sayinput" value="">
<input type="button" name="send" id="send" value="发送"> <script src="./socket.io.js"></script>
<script>
var socket = io('http://localhost:9001');
socket.on('news', function (data) {
document.querySelector('#chatroom').innerHTML += data.msg + "<br/>"
}); function send() {
var sayinput = document.querySelector('#sayinput')
socket.emit('my other event', { my: sayinput.value });
sayinput.value = ''
}
document.querySelector('#send').onclick = function () {
send()
}
document.body.onkeyup = function (event) {
if (event.keyCode == 13) {
send()
}
}
</script>
</body>
</html>
express脚手架( express-generator)+socketio
https://my.oschina.net/freddon/blog/529599
node模拟socket的更多相关文章
- 使用Node.js+Socket.IO搭建WebSocket实时应用
Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. W ...
- (转)使用Node.js+Socket.IO搭建WebSocket实时应用
Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. W ...
- 转载:node.js socket.io
本文转自:http://www.xiaocai.name/post/cf1f9_7b6507 学习node.js socket.io 使用 用node.js(socket.io)实现数据实时推送 在 ...
- 使用Node.js+Socket.IO搭建WebSocket实时应用【转载】
原文:http://www.jianshu.com/p/d9b1273a93fd Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新 ...
- node及socket.io实现简易websocket双向通信
技术栈: vue2.0 + node + websocket( socket.io ) 1. 安装依赖 初始化vue项目后输入下方指令安装依赖包 // 推荐cnpm安装 npm i vue-socke ...
- 基于node.js+socket.io+html5实现的斗地主游戏(1)概述
一.游戏描述 说是斗地主游戏,其实是寝室自创的"捉双A",跟很多地方的捉红10.打红A差不多,大概规则是: 1.基础牌型和斗地主一样,但没有大小王,共52张牌,每人13张,这也是为 ...
- Node.js socket 双向通信
使用场景: 聊天室:大量数据常驻交互: 技术栈: Node.js, Vue.js || 原生JS 服务端代码: const app = require('http').createServe ...
- golang关键字select的三个例子, time.After模拟socket/心跳超时
golang关键字select的三个例子, time.After模拟socket/心跳超时 例子1 select会随机选择一个可执行的case // 这个例子主要说明select是随机选择一个 ...
- node.js+socket.io配置详解
由于我是在win7的环境下,在这里就以win7系统为例进行讲解了. 首先需要在nodejs官网下载最新版的node.js,下载完毕直接安装即可,安装成功后在cmd命令行中执行node指令,如下结果就说 ...
随机推荐
- https 协议信息查看
https://www.ssllabs.com/ssltest/」—————————
- Swarm配置文件管理
一.前言 Docker 17.06引入了swarm服务配置,允许您在服务映像外部或运行容器中存储非敏感信息,例如配置文件. 这允许您保持镜像尽可能通用,而无需将配置文件绑定到容器或使用环境变量.在Sw ...
- Kubelet资源预留
目录 Kubelet Node Allocatable 配置参数 配置示例 Kubelet Node Allocatable Kubelet Node Allocatable用来为Kube组件和Sys ...
- day16 常用类(String、StringBuffer、StringBuilder)
1.String是唯一一个可以直接用常量赋值的引用数据类型. String的常量也是一个对象. 数据段——字符串常量池. 2.每一个字符串常量对象在加载期放入字符串常量池. java对String常量 ...
- 笔记 oracle 创建主键自增长
笔记 (1) 创建表 create table test( id number(18,2) primary key, -- 主键(unique+not null) name varchar2(100) ...
- linux网卡的开启
一:文件配置网卡在开机时,自动启用 首先我们使用 ip addr查看IP信息 [root@redhat2 network-scripts]# ip addr : lo: <LOOPBACK,UP ...
- JS中的异步与回调
问题的引出:在js中使用异步调用时,有可能会出现在异步的回调函数中设置调用之外的变量值,但在异步调用完成后去使用变量,却发现这些变量值并没有被成功设置的情况.如: google map中的地理编码,地 ...
- Dubbo学习笔记2:Dubbo服务提供端与消费端应用的搭建
Demo结构介绍 Demo使用Maven聚合功能,里面有三个模块,目录如下: 其中Consumer模块为服务消费者,里面TestConsumer和consumer.xml组成了基于Spring配置方式 ...
- python学习笔记3-函数,判断负小数
一.函数 def hello(file_name,content): #形参file_name content f=open(file_name,'a+') f.seek(0) f.write(con ...
- Java并发编程原理与实战十八:读写锁
ReadWriteLock也是一个接口,提供了readLock和writeLock两种锁的操作机制,一个资源可以被多个线程同时读,或者被一个线程写,但是不能同时存在读和写线程. 基本规则: 读读不互斥 ...