nodejs 简单的模拟代理服务器
代理前:client -> server
代理后:client -> proxy -> server
game-client.js:
const net = require("net");
const serverAddress = {
host: "127.0.0.1",
port: 5000,
};
const proxyAddress = {
host: "127.0.0.1",
port: 3000,
};
let a = 0;
// 这里要处理的就是,如何把client请求地址,指向我编写的代理服务器
const client = net.createConnection(proxyAddress, () => {
console.log("client start port is: " + client.address().port);
setInterval(() => {
console.log(`--> ${a}`);
client.write(a.toString());
a++;
}, 1000);
});
client.on("data", (data) => {
console.log("<-- " + data.toString());
});
client.on("end", () => {
console.log("与服务器断开连接");
});
client.on("error", () => {
console.log(`Error`);
});
client.on("timeout", () => {
console.log(`Timeout`);
});
client.on("close", () => {
console.log(`Close`);
});
game-server.js:
const net = require("net");
const server = net.createServer((c) => {
server.getConnections((e, count) => console.log("Count: " + count));
c.on("data", (data) => {
c.write(data.toString());
// c.end(); // 主动断开与客户端的连接
});
c.on("end", () => {
console.log(`客户端End`);
});
c.on("error", () => {
console.log(`客户端Error`);
c.destroy();
});
c.on("timeout", () => {
console.log(`客户端Timeout`);
});
c.on("close", () => {
console.log(`客户端Close`);
c.destroy();
});
});
server.listen(5000, () => {
console.log("server start port is: " + server.address().port);
});
game-proxy-server.js
const net = require("net");
const serverAddress = {
host: "127.0.0.1",
port: 5000,
};
let _clientSocket = null;
// 创建一个客户端与game server联系
const client = net.createConnection(serverAddress);
// 将服务器返回的数据,返给client
client.on("data", (data) => {
console.log("proxy send client " + data);
if (_clientSocket) _clientSocket.write(data);
});
// 创建代理服务器与game client联系
const server = net.createServer((clientSocket) => {
_clientSocket = clientSocket;
// 接受client的消息,转发给服务器
clientSocket.on("data", (data) => {
// 发给服务器
console.log("proxy send server " + data);
client.write(data);
});
clientSocket.on("end", () => {
console.log(`game client End`);
});
clientSocket.on("error", () => {
clientSocket.destroy();
});
clientSocket.on("timeout", () => {
console.log(`game client Timeout`);
});
clientSocket.on("close", () => {
clientSocket.destroy();
});
});
server.listen(3000, () => {
console.log("proxy server start port is: " + server.address().port);
});
client print:
client start port is: 6259
--> 0
<-- 0
--> 1
<-- 1
--> 2
prixy print:
proxy server start port is: 3000
proxy send server0
proxy send client0
proxy send server1
proxy send client1
nodejs 简单的模拟代理服务器的更多相关文章
- nodejs与websocket模拟简单的聊天室
nodejs与websocket模拟简单的聊天室 server.js const http = require('http') const fs = require('fs') var userip ...
- PhantomJS实现最简单的模拟登录方案
以前写爬虫,遇到需要登录的页面,一般都是通过chrome的检查元素,查看登录需要的参数和加密方法,如果网站的加密非常复杂,例如登录qq的,就会很蛋疼 在后面,有了Pyv8,就可以把加密的js文件扔给它 ...
- telnet简单操作 模拟请求
telnet简单操作 模拟请求 一: 二: 三: 按照以上操作即可!
- 简单的http代理服务器
简单的http代理服务器 本项目课程是基于 Python 实现的一个简单的 HTTP 代理服务器,要求用户需了解 Python 基础和一定的 HTTP 服务器基础知识.
- NodeJS简单爬虫
NodeJS简单爬虫 最近一直在追火星的一本书,然后每次都要去网站看,感觉很麻烦,于是,想起用爬虫爬取章节,务实派,说干就干! 爬取思路 1.该网站的页面呈现出一定的规律 2.使用NodeJS的req ...
- I.MX6 简单电路模拟USB设备的插入
/**************************************************************************** * I.MX6 简单电路模拟USB设备的插入 ...
- C++动态数组简单的模拟二元堆
//C++动态数组简单的模拟二元堆 #include<iostream> using namespace std; class BinaryHeap { private: int cap; ...
- 洛谷[Luogu] 普及村-简单的模拟总结
题目列表 注明:Level值代表在本难度下的排行.(纯粹本蒟蒻主观评判)注明:Level值代表在本难度下的排行.(纯粹本蒟蒻主观评判)注明:Level值代表在本难度下的排行.(纯粹本蒟蒻主观评判) P ...
- nodejs简单数据迁移demo
近期做数据迁移,采用nodejs框架,数据库为mysql.作为一枚菜鸟,在编码过程中,遇到众多奇葩问题,感谢民少给予的支持. 由于旧数据库中的数据,在之前设计中存在众多不合理的情况,因此在数据迁移中, ...
随机推荐
- setTimeout、Promise、Async/Await 的区别
事件循环中分为宏任务队列和微任务队列其中setTimeout的回调函数放到宏任务队列里,等到执行栈清空以后执行promise.then里的回调函数会放到相应宏任务的微任务队列里,等宏任务里面的同步代码 ...
- 【进阶】ZooKeeper 相关概念总结
1. 开卷有益 学习是一种习惯,只有把这种习惯保持下来,每天不学习一点就感觉浑身不自在,达到这样的境界,那么你成为大佬也就不远了买,正如我们标题所写的"开卷有益".人生匆匆,要想过 ...
- 八:SpringBoot-集成JPA持久层框架,简化数据库操作
SpringBoot-集成JPA持久层框架,简化数据库操作 1.JPA框架简介 1.1 JPA与Hibernate的关系: 2.SpringBoot整合JPA Spring Data JPA概述: S ...
- Spring Boot构建 RESTful 风格应用
Spring Boot构建 RESTful 风格应用 1.Spring Boot构建 RESTful 风格应用 1.1 实战 1.1.1 创建工程 1.1.2 构建实体类 1.1.4 查询定制 1.1 ...
- 客户端负载均衡Ribbon
客户端负载均衡Ribbon 一.Ribbon是什么 二.Ribbon实现客户端负载均衡 三.Ribbon负载均衡策略 四.Rest请求模板类解读 4.1 RestTemplate的GET请求 第一种: ...
- Java面试(解答题二)
1.一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他用户.备注:用户表:tb,角色字段为role,主键为id.请写出sql语句. 解答: 2.概述MVC体系结构 解答: MVC包括三类对 ...
- (13)Linux文件系统的优缺点
通过文件系统的方式来组织磁盘存储和数据管理.有以下几个方面的好处. 数据的读取.管理操作变得简单 文件系统给用户提供了一个简单的操作界面,用户可以通过对文件系统的简单操作,实现对磁盘的管理.虽然 Li ...
- Java排序算法(二)选择排序
一.测试类SortTest import java.util.Arrays; public class SortTest { private static final int L = 20; publ ...
- 2019 第十届蓝桥杯大赛软件类省赛 Java A组 题解
2019 第十届蓝桥杯大赛软件类省赛 Java A组 试题A 题解 题目最后一句贴心的提示选手应该使用 long (C/C++ 应该使用 long long). 本题思路很直白,两重循环.外层 ...
- HDU - 6761 Minimum Index (字符串,Lyndon分解)
Minimum Index 题意 求字符串所有前缀的所有后缀表示中字典序最小的位置集合,最终转换为1112进制表示.比如aab,有三个前缀分别为a,aa,aab.其中a的后缀只有一个a,位置下标1:a ...