mirror of
https://gitee.com/johng/gf
synced 2026-06-06 02:25:47 +08:00
100 lines
2.3 KiB
Go
100 lines
2.3 KiB
Go
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
|
//
|
|
// This Source Code Form is subject to the terms of the MIT License.
|
|
// If a copy of the MIT was not distributed with this file,
|
|
// You can obtain one at https://github.com/gogf/gf.
|
|
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"time"
|
|
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"github.com/gogf/gf/v2/net/gtcp"
|
|
"github.com/gogf/gf/v2/os/gctx"
|
|
"github.com/gogf/gf/v2/os/gtime"
|
|
"github.com/gogf/gf/v2/os/gtimer"
|
|
)
|
|
|
|
const (
|
|
AddressOfServer1 = ":8198"
|
|
AddressOfServer2 = ":8199"
|
|
UpStream = "127.0.0.1:8198"
|
|
)
|
|
|
|
var (
|
|
ctx = gctx.GetInitCtx()
|
|
)
|
|
|
|
// StartTCPServer1 starts Server1: A simple tcp server for demo.
|
|
// It reads the content from client connect and write it back to client.
|
|
func StartTCPServer1() {
|
|
s := g.TCPServer(1)
|
|
s.SetHandler(func(conn *gtcp.Conn) {
|
|
defer conn.Close()
|
|
for {
|
|
data, err := conn.Recv(-1)
|
|
if err != nil {
|
|
g.Log().Errorf(ctx, `%+v`, err)
|
|
break
|
|
}
|
|
if len(data) > 0 {
|
|
err = conn.Send([]byte(fmt.Sprintf(`received: %s`, data)))
|
|
if err != nil {
|
|
g.Log().Errorf(ctx, `%+v`, err)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
})
|
|
s.SetAddress(AddressOfServer1)
|
|
s.Run()
|
|
}
|
|
|
|
// StartTCPServer2 starts Server2:
|
|
// All requests to Server2 are directly redirected to Server1.
|
|
func StartTCPServer2() {
|
|
s := g.TCPServer(2)
|
|
s.SetHandler(func(conn *gtcp.Conn) {
|
|
defer conn.Close()
|
|
// Each client connection associates an upstream connection.
|
|
upstreamClient, err := gtcp.NewConn(UpStream)
|
|
if err != nil {
|
|
_, _ = conn.Write([]byte(fmt.Sprintf(
|
|
`cannot connect to upstream "%s": %s`, UpStream, err.Error(),
|
|
)))
|
|
return
|
|
}
|
|
// Redirect the client connection reading and writing to upstream connection.
|
|
for {
|
|
go io.Copy(upstreamClient, conn)
|
|
_, err = io.Copy(conn, upstreamClient)
|
|
if err != nil {
|
|
_, _ = conn.Write([]byte(fmt.Sprintf(
|
|
`io.Copy to upstream "%s" failed: %s`, UpStream, err.Error(),
|
|
)))
|
|
}
|
|
}
|
|
})
|
|
s.SetAddress(AddressOfServer2)
|
|
s.Run()
|
|
}
|
|
|
|
func main() {
|
|
go StartTCPServer1()
|
|
go StartTCPServer2()
|
|
time.Sleep(time.Second)
|
|
gtimer.Add(ctx, time.Second, func(ctx context.Context) {
|
|
address := fmt.Sprintf(`127.0.0.1%s`, AddressOfServer2)
|
|
result, err := gtcp.SendRecv(address, []byte(gtime.Now().String()), -1)
|
|
if err != nil {
|
|
g.Log().Errorf(ctx, `send data failed: %+v`, err)
|
|
}
|
|
g.Log().Info(ctx, result)
|
|
})
|
|
g.Listen()
|
|
}
|