什么是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. web项目中classPath指的是哪里?

    classpath可以是SRC下面的路径 但是项目最终编译会到WEB-INF下面,所以有时候WEB-INF下面的classes也可以放配置文件,也可以读取到. 因为最终src都会放到WEB-INF下面 ...

  2. python代码自动补全配置及Django入门Demo

    django入门代码示例小博客:https://pan.baidu.com/s/1pLjLPSv 1.自动补全功能 许多人都知道 iPython 有很好的自动补全能力,但是就未必知道 python 也 ...

  3. 十、Shell基础

    一.shell概述 1.Shell是什么 shell是一个命令行解释器,他为用户提供了一个向linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动.挂起.停止甚至编写一些程序 ...

  4. linux环境下安装PHP扩展swoole

    swoole linux环境下的安装 最近在折腾一个伪直播页面,需求中有用到评论 开始在想直接ajax直接实现,不过想了想觉得对数据库读写太过频繁 而且对服务器压力也挺大的 百度一番发现了这么个东西 ...

  5. .gitignore 无效问题

    利用.gitignore过滤文件,如编译过程中的中间文件,等等,这些文件不需要被追踪管理. 现象: 在.gitignore添加file1文件,以过滤该文件,但是通过Git status查看仍显示fil ...

  6. windows安装filebeat服务报错

    cmd进入filebeat目录下   用以下命令执行: PowerShell.exe -ExecutionPolicy UnRestricted -File .\install-service-fil ...

  7. HDU 1564 简单博弈 水

    n*n棋盘,初始左上角有一个石头,每次放只能在相邻的四个位置之一,不能操作者输. 如果以初始石头编号为1作为后手,那么对于每次先手胜的情况其最后一步的四周的编号必定是奇数,且此时编号为偶数,而对于一个 ...

  8. 贪心问题:区间覆盖 POJ 2376 Cleaning Shift

    题目:http://poj.org/problem?id=2376 题意:就是 N 个区间, 输入 N 个区间的 [begin, end],求能用它们覆盖区间[1,T]的最小组合. 题解: 1. 首先 ...

  9. <转>Android开发使输入框点击弹出日期选择对话框的方法

    非常简单直接上代码: 转自:http://blog.sina.com.cn/s/blog_4ac1b5f60102vgnx.html final EditText et1=(EditText)find ...

  10. 20155325 2016-2017-2 《Java程序设计》第5周学习总结

    教材学习内容总结 Java中把正常流程放try块中,错误(异常)处理放catch块中. Error及其子类写程序不用处理,最多留个日志.因为这种错误Java应用程序本身是无力回复的. 在使用throw ...