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指令,如下结果就说 ...
随机推荐
- js 读写 cookie 简单实现
const getItem = key => { let ca = document.cookie.split('; '); for (let i = 0; i < ca.length; ...
- 【Asp.net入门08】第一个Asp.net应用程序-创建窗体并设置其样式
本节内容: 添加一个aspx窗体并设计窗体内容 为aspx窗体添加样式 前面我们为PartyInvites应用程序项目添加了两个c#文件:GuestResponse.cs和ResponseReposi ...
- MySQL内存计算器
MySQL如何使用内存? 首先,介绍MySQL使用内存的一些方法: 1. 会话级别的内存消耗(连接私有内存):如sort_buffer_size等,每个会话都会开辟一个sort_buffer_size ...
- print命令
#%s为变量的占位符,s是string的简写,可接受字符. %d也是占位符,用于接受数字name = input("name:")age = input("age:&qu ...
- python的dict()字典数据类型的方法详解以及案例使用
一.之前的回顾 # int 数字 # str 字符串 # list 列表 # tuple 元组 # dict 字典 字典中最重要的方法 keys() values() items() get upd ...
- SQL优化:
今日给人查找数据,时间关系,写个比较粗暴的SQL语句: #2s587ms#直接将所有表关联,比较粗暴 select go.businessId,dd.dict_namefrom fn_xte.gt ...
- RabbitMQ基础介绍
非原创,仅作为个人的学习资料,转自 anzhsoft http://blog.csdn.net/anzhsoft/article/details/19563091, 1. 历史 RabbitMQ是一个 ...
- javamail模拟邮箱功能获取邮件内容-中级实战篇【内容|附件下载方法】(javamail API电子邮件实例)
引言: JavaMail jar包下载地址:http://java.sun.com/products/javamail/downloads/index.html 此篇是紧随上篇文章而封装出来的,阅读本 ...
- python sqlite3 入门 (视频讲座)
python sqlite3 入门 (视频讲座) an SQLite mini-series! - Simple Databases with Python 播放列表: YouTube https:/ ...
- ASP.NET对无序列表批量操作的三种方法
在网页开发中,经常要用到无序列表.事实上在符合W3C标准的div+css布局中,无序列表被大量使用,ASP.NET虽然内置了BulletedList控件,用于创建和操作无序列表,但感觉不太好用.本篇介 ...