代理前: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. setTimeout、Promise、Async/Await 的区别

    事件循环中分为宏任务队列和微任务队列其中setTimeout的回调函数放到宏任务队列里,等到执行栈清空以后执行promise.then里的回调函数会放到相应宏任务的微任务队列里,等宏任务里面的同步代码 ...

  2. 【进阶】ZooKeeper 相关概念总结

    1. 开卷有益 学习是一种习惯,只有把这种习惯保持下来,每天不学习一点就感觉浑身不自在,达到这样的境界,那么你成为大佬也就不远了买,正如我们标题所写的"开卷有益".人生匆匆,要想过 ...

  3. 八:SpringBoot-集成JPA持久层框架,简化数据库操作

    SpringBoot-集成JPA持久层框架,简化数据库操作 1.JPA框架简介 1.1 JPA与Hibernate的关系: 2.SpringBoot整合JPA Spring Data JPA概述: S ...

  4. Spring Boot构建 RESTful 风格应用

    Spring Boot构建 RESTful 风格应用 1.Spring Boot构建 RESTful 风格应用 1.1 实战 1.1.1 创建工程 1.1.2 构建实体类 1.1.4 查询定制 1.1 ...

  5. 客户端负载均衡Ribbon

    客户端负载均衡Ribbon 一.Ribbon是什么 二.Ribbon实现客户端负载均衡 三.Ribbon负载均衡策略 四.Rest请求模板类解读 4.1 RestTemplate的GET请求 第一种: ...

  6. Java面试(解答题二)

    1.一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他用户.备注:用户表:tb,角色字段为role,主键为id.请写出sql语句. 解答: 2.概述MVC体系结构 解答: MVC包括三类对 ...

  7. (13)Linux文件系统的优缺点

    通过文件系统的方式来组织磁盘存储和数据管理.有以下几个方面的好处. 数据的读取.管理操作变得简单 文件系统给用户提供了一个简单的操作界面,用户可以通过对文件系统的简单操作,实现对磁盘的管理.虽然 Li ...

  8. Java排序算法(二)选择排序

    一.测试类SortTest import java.util.Arrays; public class SortTest { private static final int L = 20; publ ...

  9. 2019 第十届蓝桥杯大赛软件类省赛 Java A组 题解

    2019 第十届蓝桥杯大赛软件类省赛 Java A组 试题A 题解 ​ 题目最后一句贴心的提示选手应该使用 long (C/C++ 应该使用 long long). ​ 本题思路很直白,两重循环.外层 ...

  10. HDU - 6761 Minimum Index (字符串,Lyndon分解)

    Minimum Index 题意 求字符串所有前缀的所有后缀表示中字典序最小的位置集合,最终转换为1112进制表示.比如aab,有三个前缀分别为a,aa,aab.其中a的后缀只有一个a,位置下标1:a ...