放在这里做个备份
package main
import (
"fmt"
"log"
"net"
)
const (
realServer = "127.0.0.1:9002"
selfPort = 9010
)
type gameConn struct {
ClientConn net.Conn
PkgBuf [maxPkgSize]byte
PkgLen int
Channel chan int
}
var gbChannel chan int
var 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 := 0
go redisProcess(serverConn)
for {
// Wait for a connection.
conn, err := l.AcceptTCP()
if err != nil {
log.Fatal(err)
}
go start(conn, index)
index++
}
}
package main
import (
"fmt"
"net"
)
const (
maxPkgSize = (4 * 1024 * 1024)
)
func start(netConn net.Conn, id int) {
connInfo := new(gameConn)
connInfo.ClientConn = netConn
connInfo.Channel = make(chan int)
connMap[id] = connInfo
var err error
connInfo.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
for {
<-connInfo.Channel
connInfo.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 *gameConn
var id int
for {
id = <-gbChannel
pGameConn = 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
}
}