go-peer/pkg/network/examples/echo/main.go
2024-12-29 20:56:02 +07:00

68 lines
1.6 KiB
Go

package main
import (
"context"
"fmt"
"time"
"github.com/number571/go-peer/pkg/message/layer1"
"github.com/number571/go-peer/pkg/network"
"github.com/number571/go-peer/pkg/network/conn"
"github.com/number571/go-peer/pkg/payload"
)
// client <-> service
const (
serviceHeader = 0xDEADBEAF
serviceAddress = "127.0.0.1:8080"
)
var handler = func(ctx context.Context, node network.INode, c conn.IConn, msg layer1.IMessage) error {
resp := fmt.Sprintf("echo: [%s]", string(msg.GetPayload().GetBody()))
_ = c.WriteMessage(
ctx,
layer1.NewMessage(
layer1.NewConstructSettings(&layer1.SConstructSettings{
FSettings: node.GetSettings().GetConnSettings().GetMessageSettings(),
}),
payload.NewPayload32(serviceHeader, []byte(resp)),
),
)
return nil
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
var (
_ = runServiceNode(ctx)
conn, _ = conn.Connect(ctx, connSettings(), serviceAddress)
)
_ = conn.WriteMessage(
ctx,
layer1.NewMessage(
layer1.NewConstructSettings(&layer1.SConstructSettings{
FSettings: conn.GetSettings().GetMessageSettings(),
}),
payload.NewPayload32(serviceHeader, []byte("hello, world!")),
),
)
readCh := make(chan struct{})
go func() { <-readCh }()
recvMsg, _ := conn.ReadMessage(ctx, readCh)
fmt.Println(string(recvMsg.GetPayload().GetBody()))
}
func runServiceNode(ctx context.Context) network.INode {
node := newNode(serviceAddress).HandleFunc(serviceHeader, handler)
go func() { _ = node.Run(ctx) }()
time.Sleep(time.Second) // wait listener
return node
}