代理前: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. MSSQL 注入笔记

    前置知识: 登录名:登录sql server服务器的用户,而不是操作"数据库用户名". 固定服务器角色:就是上面登录名所属的权限组.其中重要的就是"sysadmin&qu ...

  2. Jenkins部署静态资源文件

    Jenkins部署静态资源文件 1.Jenkins部署静态资源文件 1.1 设置项目名称.参数(环境.分支)等 1.2 配置源码管理 1.3 配置构建参数 2.项目实战demo 2.1 demo1 部 ...

  3. MySql数据表设计,索引优化,SQL优化,其他数据库

    MySql数据表设计,索引优化,SQL优化,其他数据库 1.数据表设计 1.1数据类型 1.2避免空值 1.3text类型优化 2.索引优化 2.1索引分类 2.2索引优化 3.SQL优化 3.1分批 ...

  4. toggle() 隐藏和收缩

    <!DOCTYPE html><html><head><script src="/jquery/jquery-1.11.1.min.js" ...

  5. IPSec 专题----转自华为文档

    参考链接:https://support.huawei.com/enterprise/zh/doc/EDOC1000122878?section=j004 IPSec 特性全景 1.介绍 由于IP报文 ...

  6. docker(9)Dockerfile制作镜像

    前言 如果我们已经安装了一个python3的环境,如果另一台机器也需要安装同样的环境又要敲一遍,很麻烦,这里可以配置Dockerfile文件,让其自动安装,类似shell脚本 Dockerfile编写 ...

  7. C - C(换钱问题)

    换钱问题: 给出n种钱,m个站点,现在有第 s种钱,身上有v 这么多: 下面 m行 站点有a,b两种钱,rab a->b的汇率,cab a-->b的手续费, 相反rba cba :  问在 ...

  8. CF Hello 2020 E.New Year and Castle Construction

    E.New Year and Castle Construction 题意 给定n个点,对于每个点\(p\),求出4-point 子集(该子集有四个点,并且围成的圈包含\(p\))的个数 数据给的点中 ...

  9. python+fiddler 抓取抖音数据包并下载抖音视频

    这个我们要下载视频,那么肯定首先去找抖音视频的url地址,那么这个地址肯定在json格式的数据包中,所以我们就去专门查看json格式数据包 这个怎么找我就不用了,直接看结果吧 你找json包,可以选大 ...

  10. QQ空间自动点赞js代码

    1.jQuery().each(): each() 方法为每个匹配元素规定要运行的函数. 提示:返回 false 可用于及早停止循环. 函数原型: function(index,element) 为每 ...