golang 并行转串行透明代理

来源:互联网 发布:sql组合主键 编辑:程序博客网 时间:2024/06/11 17:55

放在这里做个备份


package mainimport ("fmt""log""net")const (realServer = "127.0.0.1:9002"selfPort   = 9010)type gameConn struct {ClientConn net.ConnPkgBuf     [maxPkgSize]bytePkgLen     intChannel    chan int}var gbChannel chan intvar connMap map[int](*gameConn)func main() {// Listen on TCP port 2000 on all interfaces.ip := net.ParseIP("0.0.0.0")addr := net.TCPAddr{ip, selfPort}l, err := net.ListenTCP("tcp", &addr)if err != nil {log.Fatal(err)}serverConn, err := net.Dial("tcp", realServer)if err != nil {fmt.Println(err)return}log.Printf("starting server...")gbChannel = make(chan int)connMap = make(map[int](*gameConn))index := 0go redisProcess(serverConn)for {// Wait for a connection.conn, err := l.AcceptTCP()if err != nil {log.Fatal(err)}go start(conn, index)index++}}


package mainimport ("fmt""net")const (maxPkgSize = (4 * 1024 * 1024))func start(netConn net.Conn, id int) {connInfo := new(gameConn)connInfo.ClientConn = netConnconnInfo.Channel = make(chan int)connMap[id] = connInfovar err errorconnInfo.PkgLen, err = netConn.Read(connInfo.PkgBuf[:])if err != nil {fmt.Println(err)return} else if connInfo.PkgLen >= maxPkgSize {fmt.Printf("too long:%i\n", connInfo.PkgLen)} else {//fmt.Printf("length:%i\n", length)}gbChannel <- idfor {<-connInfo.ChannelconnInfo.PkgLen, err = netConn.Read(connInfo.PkgBuf[:])if err != nil {fmt.Println(err)return} else if connInfo.PkgLen >= maxPkgSize {fmt.Printf("too long:%i\n", connInfo.PkgLen)} else {//fmt.Printf("length:%i\n", length)}gbChannel <- id}}func redisProcess(serverConn net.Conn) {var pGameConn *gameConnvar id intfor {id = <-gbChannelpGameConn = connMap[id]if pGameConn == nil {continue}length, err := serverConn.Write(pGameConn.PkgBuf[:pGameConn.PkgLen])if err != nil {fmt.Println(err)continue}length, err = serverConn.Read(pGameConn.PkgBuf[:])if err != nil {fmt.Println(err)continue} else if length >= maxPkgSize {fmt.Printf("too long:%i\n", length)} else {//fmt.Printf("length:%i\n", length)}length, err = pGameConn.ClientConn.Write(pGameConn.PkgBuf[:length])if err != nil {fmt.Println(err)continue}pGameConn.Channel <- 1}}