go网关
package main import (
"flag"
"fmt"
"io"
"net"
"os"
"strings"
"sync"
) var lock sync.Mutex
var trueList []string
var ip string
var list string
var javaApiHost string func main() {
fmt.Println("into func main") //Package flag implements command-line flag parsing.
flag.StringVar(&ip, "l", ":9897", "-l=0.0.0.0:9897 指定服务监听的端口")
//flag.StringVar(&list, "d", "127.0.0.1:1789,127.0.0.1:1788", "-d=127.0.0.1:1789,127.0.0.1:1788 指定后端的IP和端口,多个用','隔开")
flag.StringVar(&list, "d", "1.2.3.4:8080", "-d=1.2.3.4:8080 指定后端的IP和端口,多个用','隔开")
flag.Parse()
trueList = strings.Split(list, ",")
fmt.Println(trueList) if len(trueList) <= 0 {
fmt.Println("后端IP和端口不能空,或者无效")
os.Exit(1)
}
server()
} func server() {
lis, err := net.Listen("tcp", ip)
if err != nil {
fmt.Println(err)
return
}
defer lis.Close()
for {
conn, err := lis.Accept()
if err != nil {
fmt.Println("建立连接错误:%v\n", err)
continue
}
fmt.Println(conn.RemoteAddr(), conn.LocalAddr())
go handle(conn)
}
} func handle(sconn net.Conn) {
defer sconn.Close()
ip, ok := getIP()
if !ok {
return
}
dconn, err := net.Dial("tcp", ip)
if err != nil {
fmt.Printf("连接%v失败:%v\n", ip, err)
return
}
ExitChan := make(chan bool, 1)
go func(sconn net.Conn, dconn net.Conn, Exit chan bool) {
_, err := io.Copy(dconn, sconn)
fmt.Printf("往%v发送数据失败:%v\n", ip, err)
ExitChan <- true
}(sconn, dconn, ExitChan)
go func(sconn net.Conn, dconn net.Conn, Exit chan bool) {
_, err := io.Copy(sconn, dconn)
fmt.Printf("从%v接收数据失败:%v\n", ip, err)
ExitChan <- true
}(sconn, dconn, ExitChan)
<-ExitChan
dconn.Close()
} func getIP() (string, bool) {
lock.Lock()
defer lock.Unlock() if len(trueList) < 1 {
return "", false
}
ip := trueList[0]
trueList = append(trueList[1:], ip)
return ip, true
}
golang 实现tcp转发代理 - Go语言中文网 - Golang中文社区 https://studygolang.com/articles/7261
go网关的更多相关文章
- 前端学HTTP之网关、隧道和中继
前面的话 Web是一种强大的内容发布工具.人们已经从只在网上发送静态的在线文档,发展到共享更复杂的资源,比如数据库内容或动态生成的HTML页面.Web浏览器为用户提供了一种统一的方式来访问因特网上的内 ...
- IP地址,子网掩码,默认网关,DNS服务器知识详解(转)
转自:http://www.cnblogs.com/JuneWang/p/3917697.html 为了更深入的学习TCP/IP协议,最近看了不少有关资料,收集整理记录如下,以备后面的使用和方便各位学 ...
- 如何为RD网关创建自建签名的证书
创建安全的RD网关是一件非常好的事情,这样可以在公网环境下直接远程接入内部的已开启远程访问的主机服务器. 建立这个安全的RD网关需要的材料有RD网关本身,以及一个证书.由于一般情况下这些在RD网关后面 ...
- 用API网关把API管起来
最开始只是想找个API网关防止API被恶意请求,找了一圈发现基于Nginx的OpenResty(Lua语言)扩展模块Orange挺好(也找了Kong,但是感觉复杂了点没用),还偷懒用Vagrant结合 ...
- TCP/IP协议中网关和子网掩码概念
网关: 不同网段的IP是不能直接互通的,需要一个设备来转发,这个设备就是网关,一般就是路由器,那么路由器的地址就是网关地址. 比如192.168.2.31要往192.168.3.31发送一条消息,他们 ...
- IP地址,子网掩码、默认网关,DNS服务器是什么意思?
(一) 问题解析001. 问: IP地址,子网掩码,默认网关,DNS服务器,有什么区别呀?我知道没有IP地址就不能上网,我也知道没设DNS就不能上外网,可它们都有什么功能,有什么区别呢?还有真 ...
- IP地址,子网掩码,默认网关,DNS服务器详解
为了更深入的学习TCP/IP协议,最近看了不少有关资料,收集整理记录如下,以备后面的使用和方便各位学习: IP地址,子网掩码,默认网关,DNS服务器是什么意思? (一) 问题解析 001. 问: ...
- win10取消vpn使用远程默认网关
打开%AppData%\Microsoft\Network\Connections\Pbk,找到rasphone.pbk文件(当你新建拨号连接或者VPN连接之后会在这个目录创建一个.pbk的文件,这个 ...
- 在Centos7服务器上搭建网关服务
准备搭建网关的服务器环境介绍: OS:Centos7.1 网络:一块网卡,能够上网(能够连接到更外层网络),IP为192.168.7.54 内存.CPU随意 以下命令的作用依次是: 开启ip_forw ...
- 讯时网关IP对接PBX
先配置呼入 1.在网关的中继线绑定号码 2.在路由表写入到PBX 路由到 pbx IP 绑定的号码和路由的 fxo后面的数字要一致 3.在PBX 建一个sip中继,host为网关IP 4.创 ...
随机推荐
- 标准C程序设计七---61
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- AC日记——【模板】线段树 2 洛谷 P3373
P3373 [模板]线段树 2387通过1.8K提交标签难度 提高+/省选- 提交 讨论 题解 最新讨论 更多讨论 2333最后三个点卡常数.迷之RE感觉这题很迷啊好像一共三组测试数据.友情提示:开l ...
- vue v-on:click传递动态参数
最近项目中要为一个循环列表动态传送当前点击列的数据,查了很久资料也没有一个完美的解决方案, 新手只能用vue的事件处理器与jquery的选择器做了一个不伦不类的方案,居然也能解决这个问题,作此记录留待 ...
- java多线程04----------final和static
final和static关键字 final关键字 1.final关键字在单线程中的特点: 1)final修饰的静态成员:必须在进行显示初始化或静态代码块赋值,并且仅能赋值一次. 2)final修饰的类 ...
- CreateJS结合Falsh工具生成Canvas动画(加密字符串的由来)
CreateJS是一款制作Canvas动画的工具. 官网如下: http://www.createjs.com/ http://www.createjs.cc/ 使用CreateJS时最大的疑问就是J ...
- MAC终端命令行整理
参考:http://www.jianshu.com/p/3291de46f3ff 目录操作 命令名 说明 举例 cd 切换到指定目录 cd test ls 查看这个目录下的所有文件 ls /Users ...
- Android Framework 记录之一
简介 之前的研究太偏向应用层功能实现了,很多原理不了解没有深究,现在研究framework框架层了. 记录 1.下载源码,目录如下: 2.Android系统的层次如下: 3.项目目录简单分析如下: 4 ...
- 拦截recyclerview 的item 的点击事件
recyclerview.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(),recyclerview, new Re ...
- Qt5.1.1实现调用google地图显示
1.调用google地图工程文件 QT +=webkit QT +=webkitwidgets QT += core gui greaterThan(QT_MAJOR_VERSION, ): QT + ...
- 【转】Ubuntu下出现Mysql error(2002)的解决方法
过了一阵子后,为了写分布式作业,重新使用Mysql时,发现虽然启动成功了,但是连接的时候去出现如下错误ERROR 2002 (HY000): Can't connect to local MySQL ...