```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()
}
1、首先使用一个公共的端口作为监听,让HTTP和HTTPS服务分别监听在各自的端口上。2、其次在公共端口服务区分这是HTTP请求还是HTTPS请求。
3、最后各自转发到所服务的监听即可。