重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
初学go,写一个端口转发工具。很方便的小工具,希望能对大家学习go语言有所帮助。
成都创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于网站设计制作、成都做网站、嘉黎网络推广、小程序设计、嘉黎网络营销、嘉黎企业策划、嘉黎品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联公司为所有大学生创业者提供嘉黎建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com
```Golang
package main
import(
"fmt"
"io"
"net"
"sync"
)
varlocksync.Mutex
vartrueList[]string
varipstring
varliststring
funcmain(){
ip="0.0.0.0:888"
server()
}
funcserver(){
fmt.Printf("Listening%s",ip)
lis,err:=net.Listen("tcp",ip)
iferr!=nil{
fmt.Println(err)
return
}
deferlis.Close()
for{
conn,err:=lis.Accept()
iferr!=nil{
fmt.Println("建立连接错误:%v\n",err)
continue
}
fmt.Println(conn.RemoteAddr(),conn.LocalAddr())
gohandle(conn)
}
}
funchandle(sconnnet.Conn){
defersconn.Close()
ip:="127.0.0.1:8888"
dconn,err:=net.Dial("tcp",ip)
iferr!=nil{
fmt.Printf("连接%v失败:%v\n",ip,err)
return
}
ExitChan:=make(chanbool,1)
gofunc(sconnnet.Conn,dconnnet.Conn,Exitchanbool){
io.Copy(dconn,sconn)
ExitChan-true
}(sconn,dconn,ExitChan)
gofunc(sconnnet.Conn,dconnnet.Conn,Exitchanbool){
io.Copy(sconn,dconn)
ExitChan-true
}(sconn,dconn,ExitChan)
-ExitChan
dconn.Close()
}
内网穿透即是使用公网服务器作为代理,转发内网(如办公室、家里)的网络请求使其能够在外网中被访问到。
server端监听两个端口,一个用来和接收用户的http请求,一个监听gRPC客户端,和内网服务器进行通信;
client启动时连接server端;
当User请求server http端口时,将http进行阻塞,并将User请求内容通过gRPC发给client;
client将从server收到的请求发往本地的http服务;
client将从本地程序收到的http response通过gRPC发送给server;
server结束http阻塞,将从client收到的http response发给User。
github地址:
1、首先使用一个公共的端口作为监听,让HTTP和HTTPS服务分别监听在各自的端口上。
2、其次在公共端口服务区分这是HTTP请求还是HTTPS请求。
3、最后各自转发到所服务的监听即可。