Channel driven multiplexing connection
go get github.com/hyperf/roc
roc-skeleton
action/foo_save_action.go
package action
import (
"encoding/json"
"fmt"
"github.com/hyperf/roc"
"github.com/hyperf/roc/exception"
"github.com/hyperf/roc/formatter"
"github.com/hyperf/roc/serializer"
)
type FooSaveAction struct {
}
type FooSaveInput struct {
Name string `json:"name"`
Gender int `json:"gender"`
}
type FooSaveRequest struct {
ID int
Input FooSaveInput
}
func (m * FooSaveRequest ) UnmarshalJSON (bytes []byte ) error {
var raw []json.RawMessage
if err := json .Unmarshal (bytes , & raw ); err != nil {
return err
}
if err := json .Unmarshal (raw [0 ], & m .ID ); err != nil {
return err
}
if err := json .Unmarshal (raw [1 ], & m .Input ); err != nil {
return err
}
return nil
}
type FooSaveResult struct {
IsSuccess bool `json:"is_success"`
}
func (f * FooSaveAction ) getRequest (packet * roc.Packet , serializer serializer.SerializerInterface ) (* FooSaveRequest , exception.ExceptionInterface ) {
req := & formatter.JsonRPCRequest [* FooSaveRequest , any ]{}
if err := serializer .UnSerialize (packet .GetBody (), req ); err != nil {
return nil , exception .NewDefaultException (err .Error ())
}
return req .Data , nil
}
func (f * FooSaveAction ) Handle (packet * roc.Packet , serializer serializer.SerializerInterface ) (any , exception.ExceptionInterface ) {
request , e := f .getRequest (packet , serializer )
if e != nil {
return nil , e
}
fmt .Println (request .ID , request .Input .Name )
return & FooSaveResult {IsSuccess : true }, nil
}
package main
import (
"github.com/hyperf/roc"
"github.com/hyperf/roc/examples/json_rpc/action"
"github.com/hyperf/roc/exception"
"github.com/hyperf/roc/formatter"
"github.com/hyperf/roc/router"
"github.com/hyperf/roc/server"
)
func SetUpRouters () * router.SimpleRouter {
r := router .NewSimpleRouter ()
r .Add ("/foo/save" , & action.FooSaveAction {})
return r
}
func main () {
r := SetUpRouters ()
handler := server .NewTcpServerHandler (func (route * formatter.JsonRPCRoute , packet * roc.Packet , server * server.TcpServer ) (any , exception.ExceptionInterface ) {
action , ok := r .Routes [route .Path ]
if ! ok {
return nil , & exception.Exception {Code : exception .NOT_FOUND , Message : "The route is not defined." }
}
return action .Handle (packet , server .Serializer )
})
serv := server .NewTcpServer ("0.0.0.0:9501" , handler )
serv .Start ()
}
package main
import (
"fmt"
cli "github.com/hyperf/roc/client"
"github.com/hyperf/roc/formatter"
"time"
)
type FooSaveInput struct {
Name string `json:"name"`
Gender int `json:"gender"`
}
type FooSaveRequest struct {
ID int
Input * FooSaveInput
}
type FooSaveResult struct {
IsSuccess bool `json:"is_success"`
}
type LocalAddr struct {
}
func (l LocalAddr ) Network () string {
return "tcp"
}
func (l LocalAddr ) String () string {
return "127.0.0.1:9501"
}
func (f * FooSaveRequest ) MarshalJSON () ([]byte , error ) {
return formatter .FormatRequestToByte (f )
}
var client * cli.Client
func init () {
var err error
client , err = cli .NewAddrClient (& LocalAddr {})
if err != nil {
fmt .Println (err )
}
}
func main () {
req := FooSaveRequest {ID : 1 , Input : & FooSaveInput {Name : "limx" , Gender : 1 }}
id , _ := client .SendRequest ("/foo/save" , & req )
ret := & formatter.JsonRPCResponse [FooSaveResult , any ]{}
err := client .Recv (id , ret , cli .NewDefaultRecvOption ())
if err != nil {
fmt .Println (err )
}
fmt .Println (ret .Result .IsSuccess )
for {
req = FooSaveRequest {ID : 1 , Input : & FooSaveInput {Name : "error" , Gender : 1 }}
id , _ = client .SendRequest ("/foo/save" , & req )
ret = & formatter.JsonRPCResponse [FooSaveResult , any ]{}
err = client .Recv (id , ret , cli .NewDefaultRecvOption ())
if err != nil {
fmt .Println (err )
}
time .Sleep (time .Second )
}
}
multiplex Channel driven multiplexing connection for PHP.
multiplex-socket Socket of channel driven multiplexing connection for PHP.
rpc-multiplex RPC of channel driven multiplexing connection for PHP.