代理前: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 简单的模拟代理服务器的更多相关文章

  1. nodejs与websocket模拟简单的聊天室

    nodejs与websocket模拟简单的聊天室 server.js const http = require('http') const fs = require('fs') var userip ...

  2. PhantomJS实现最简单的模拟登录方案

    以前写爬虫,遇到需要登录的页面,一般都是通过chrome的检查元素,查看登录需要的参数和加密方法,如果网站的加密非常复杂,例如登录qq的,就会很蛋疼 在后面,有了Pyv8,就可以把加密的js文件扔给它 ...

  3. telnet简单操作 模拟请求

    telnet简单操作   模拟请求 一: 二: 三: 按照以上操作即可!

  4. 简单的http代理服务器

    简单的http代理服务器 本项目课程是基于 Python 实现的一个简单的 HTTP 代理服务器,要求用户需了解 Python 基础和一定的 HTTP 服务器基础知识.

  5. NodeJS简单爬虫

    NodeJS简单爬虫 最近一直在追火星的一本书,然后每次都要去网站看,感觉很麻烦,于是,想起用爬虫爬取章节,务实派,说干就干! 爬取思路 1.该网站的页面呈现出一定的规律 2.使用NodeJS的req ...

  6. I.MX6 简单电路模拟USB设备的插入

    /**************************************************************************** * I.MX6 简单电路模拟USB设备的插入 ...

  7. C++动态数组简单的模拟二元堆

    //C++动态数组简单的模拟二元堆 #include<iostream> using namespace std; class BinaryHeap { private: int cap; ...

  8. 洛谷[Luogu] 普及村-简单的模拟总结

    题目列表 注明:Level值代表在本难度下的排行.(纯粹本蒟蒻主观评判)注明:Level值代表在本难度下的排行.(纯粹本蒟蒻主观评判)注明:Level值代表在本难度下的排行.(纯粹本蒟蒻主观评判) P ...

  9. nodejs简单数据迁移demo

    近期做数据迁移,采用nodejs框架,数据库为mysql.作为一枚菜鸟,在编码过程中,遇到众多奇葩问题,感谢民少给予的支持. 由于旧数据库中的数据,在之前设计中存在众多不合理的情况,因此在数据迁移中, ...

随机推荐

  1. maven pom文件的 name 标签 和 url标签到底是什么作用

  2. Nginx上安装SSL证书

    准备 参考 :链接 下载的Nginx证书压缩文件解压后包含: .pem:证书文件.PEM文件的扩展名为CRT格式. .key:证书密钥文件.申请证书时如果未选择自动创建CRS,则下载的证书文件压缩包中 ...

  3. 5.DHCP新建作用域及添加地址保留(Windows2012)

    1.新建作用域 右键IPv4 点击新建作用域 点击下一步 命名,下一步 填写子网,下一步 在上一步已经预留了,直接点下一步即可. 设置租用期限,建议为3天,下一步. 下一步,配置DHCP选项 配置默认 ...

  4. js中的逻辑运算符详解(||、&&、!)

    视频地址:https://www.bilibili.com/video/BV1Y7411K7zz?p=1 一直以来都没弄清楚js中的逻辑运算符是怎么回事 , 一直都以为他们的用法和java一样 , 今 ...

  5. kafka 通俗

    把broker比作是一幢摩天大楼,一个10节点的kafka集群就是10幢摩天大楼,而且这些大楼都长得一模一样.分区就相当于大楼里的一层.一个分区就相当于一整层哦.原先大楼是空的.现在用户创建了一个to ...

  6. CPU中的程序是怎么运行起来的(预告篇)

    总述     最近一位朋友问我,我开发的代码是怎么运行起来的,我就开始给他介绍代码的预编译.汇编.编译.链接然后到一般的文件属性,再到代码运行.但是大佬问了我一句,CPU到底是怎么执行到每一个逻辑的, ...

  7. Left join查询为空

    这两个查询,上面查询返回空,下面能正常返回记录 两个表结构: left join 没有匹配上得到的b.dates,b.game_id和b.uid都是null值,在按b.dates=20200317 a ...

  8. 2019 沈阳网络赛 D Fish eating fruit ( 树形DP)

    题目传送门 题意:求一颗树中所有点对(a,b)的路径长度,路径长度按照模3之后的值进行分类,最后分别求每一类的和 分析:树形DP \(dp[i][j]\) 表示以 i 为根的子树中,所有子节点到 i ...

  9. zjnu1757Excellent (数学公式)

    Description Let us begin with a positive integer N and find the smallest positive integer which does ...

  10. qmh的测试1

    题目:传送门 首先输入一个n,之后输入n个数a(1<=a<=1e7),对这n个数排序后,你需要找到所有的它们连续的长度.把这些连续的长度排序后输出 输入 输入: 8 1 5 2 7 4 5 ...