什么是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指令,如下结果就说 ...
随机推荐
-
Gym 100703G---Game of numbers(DP)
题目链接 http://vjudge.net/contest/132391#problem/G Description standard input/outputStatements — It' s ...
-
mac多版本python安装 pymysql
系统里面安装了多个python的版本,有2.7和3.4等.默认的2.7版本,但我开发需要3.4版本的. 默认情况下,用pip安装PyMySQL $sudo pip install PyMySQL 安装 ...
-
GMTED2010 高程数据下载
http://topotools.cr.usgs.gov/GMTED_viewer/viewer.htm
-
HDU - 3853
LOOPS Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others)Total Sub ...
-
机器学习技法:08 Adaptive Boosting
Roadmap Motivation of Boosting Diversity by Re-weighting Adaptive Boosting Algorithm Adaptive Boosti ...
-
java 中二维数组的定义和遍历
定义格式 * a 第一种定义格式: * int[][] arr = new int[3][4];// arr里面包含3个数组 每个数组里面有四个元素 * 上面的代码相当于定义了一个3*4的二维数组,即 ...
-
nginx负载均衡(反向代理)
6,安装nginx 6.1 依赖库安装 要安装在root根目录里,不要装在虚拟环境里面 yum install gcc-c++ pcre pcre-devel zlib zlib-devel ope ...
-
abc高级bash shell编程
http://www.pythoner.com/122.html abc高级bash shell编程
-
AutoMapper实际项目运用
AutoMapper是对象到对象的映射工具.在完成映射规则之后,AutoMapper可以将源对象转换为目标对象. 配置AutoMapper映射规则 AutoMapper是基于约定的,因此在实用映射之前 ...
-
java web 程序--注册页面/HashMap的用法。。要懂啊
思路:1.一个form表单,用户输入后,提交 2.第二个是注册页面,主要是用Map.先假设往map里面拿东西,然后判断是否为空 若为空,new 一个HashMap它的子类,然后通过map.conta ...