This is a creation in Article, where the information may have evolved or changed.
Put it in here and make a backup.
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 of 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 * 1024x768 * 1024x768)) func Start (netconn net. Conn, id int) {conninfo: = new (gameconn) Conninfo.clientconn = Netconnconninfo.channel = make (chan int) connmap[id] = Connin Fovar 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}lengt H, Err: = Serverconn.write (pgameconn.pkgbuf[:p Gameconn.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}}
Copyright NOTICE: This article for Bo Master original article, without Bo Master permission not reproduced.