什么是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的更多相关文章

  1. 使用Node.js+Socket.IO搭建WebSocket实时应用

    Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. W ...

  2. (转)使用Node.js+Socket.IO搭建WebSocket实时应用

    Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. W ...

  3. 转载:node.js socket.io

    本文转自:http://www.xiaocai.name/post/cf1f9_7b6507  学习node.js socket.io 使用 用node.js(socket.io)实现数据实时推送 在 ...

  4. 使用Node.js+Socket.IO搭建WebSocket实时应用【转载】

    原文:http://www.jianshu.com/p/d9b1273a93fd Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新 ...

  5. node及socket.io实现简易websocket双向通信

    技术栈: vue2.0 + node + websocket( socket.io ) 1. 安装依赖 初始化vue项目后输入下方指令安装依赖包 // 推荐cnpm安装 npm i vue-socke ...

  6. 基于node.js+socket.io+html5实现的斗地主游戏(1)概述

    一.游戏描述 说是斗地主游戏,其实是寝室自创的"捉双A",跟很多地方的捉红10.打红A差不多,大概规则是: 1.基础牌型和斗地主一样,但没有大小王,共52张牌,每人13张,这也是为 ...

  7. Node.js socket 双向通信

    使用场景:  聊天室:大量数据常驻交互: 技术栈: Node.js,     Vue.js || 原生JS 服务端代码: const app = require('http').createServe ...

  8. golang关键字select的三个例子, time.After模拟socket/心跳超时

    golang关键字select的三个例子, time.After模拟socket/心跳超时   例子1 select会随机选择一个可执行的case   // 这个例子主要说明select是随机选择一个 ...

  9. node.js+socket.io配置详解

    由于我是在win7的环境下,在这里就以win7系统为例进行讲解了. 首先需要在nodejs官网下载最新版的node.js,下载完毕直接安装即可,安装成功后在cmd命令行中执行node指令,如下结果就说 ...

随机推荐

  1. spoj 375 树链剖分 模板

    QTREE - Query on a tree #tree You are given a tree (an acyclic undirected connected graph) with N no ...

  2. 《剑指offer》面试题45 圆圈中最后剩下的数字(Java版本)

    引言 这道题网上的讲解都是直接抄书,没意思,所以想自己写一写,补充一下,便于自己理解.另外,大家都忽略了经典解法,虽然这种解法效率不及第二种,但是我觉得在项目当中阅读性其实很重要,牺牲一点点效率保证代 ...

  3. Matlab修改背景颜色

    步骤: 1, 在matlab命令行中运行prefdir, 获取matlab.prf文件所在路径 2, 打开matlab.prf所在路径, 找到matlab.prf文件, 作备份 3, 将以下内容添加到 ...

  4. numpy二进制转换和范围缩放

    numpy二进制转换和范围缩放 觉得有用的话,欢迎一起讨论相互学习~Follow Me 一维二进制转换 import numpy as np # 一维二进制数组转换 a=np.array([0,1,1 ...

  5. Hbase建模选择

    日期 2017年3月17日 HBase建模记录 OLTP 应用场景: OLAP 应用场景: 语音分析系统的应用场景 基于HBase的建模考虑 1.话单为主来考虑hbase的rowkey的生成规则: 1 ...

  6. [Node.js] querystring类

    和参数相关的帮助类,原生自带,直接 require('querystring') 即可使用. 此类一共包括4个方法: querystring.stringify(obj, [sep], [eq]) q ...

  7. 你应该了解的强大CSS表达式 ----- expression

    IE5及其以后版本支持在CSS中使用expression,用来把CSS属性和Javas cript表达式关联起来,这里的CSS属性可以是元素固有的属性,也可以是自定义属性.就是说CSS属性后面可以是一 ...

  8. cmmusic:小巧而实用的mplayer音乐播放前端

    Author: Jiqing (jiqingwu@gmail.com) home: http://hi.baidu.com/jiqing0925 create: 2011-03-10 update: ...

  9. 基本控件文档-UIButton属性

    CHENYILONG Blog 基本控件文档-UIButton属性 Fullscreen UIButton属性技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博ht ...

  10. 系统学习(javascript)_基础(数据类型之间的转换)

    在js中数据类型转换一般分为两种,即强制类型转换和隐式类型转换(利用javascript弱变量类型转换). 强制转换: 利用js提供的函数parseInt(),parseFloat(),Number( ...