feat: implement server and client
This commit is contained in:
43
server.go
43
server.go
@ -5,13 +5,16 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"krwu.top/krpc.v1/client"
|
||||
"krwu.top/krpc.v1/codec"
|
||||
)
|
||||
|
||||
type Server struct{}
|
||||
type Server struct {
|
||||
serviceMap sync.Map
|
||||
}
|
||||
|
||||
func NewServer() *Server {
|
||||
return &Server{}
|
||||
@ -34,7 +37,7 @@ func (s *Server) ServeConn(conn io.ReadWriteCloser) {
|
||||
defer func() {
|
||||
_ = conn.Close()
|
||||
}()
|
||||
var opts client.Options
|
||||
var opts Options
|
||||
if err := json.NewDecoder(conn).Decode(&opts); err != nil {
|
||||
fmt.Println("rpc server: options error: ", err)
|
||||
return
|
||||
@ -68,10 +71,42 @@ func (s *Server) ServeCodec(cc codec.Codec) {
|
||||
continue
|
||||
}
|
||||
wg.Add(1)
|
||||
go s.handleRequest(cc, req, sending, wg)
|
||||
go s.handleRequest(cc, req, sending, wg, time.Second*3)
|
||||
}
|
||||
wg.Wait()
|
||||
_ = cc.Close()
|
||||
}
|
||||
|
||||
func (s *Server) Register(rcvr interface{}) error {
|
||||
svc := newService(rcvr)
|
||||
if _, dup := s.serviceMap.LoadOrStore(svc.name, svc); dup {
|
||||
return fmt.Errorf("rpc: service already defined: %s\n", svc.name)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Server) findService(serviceMethod string) (svc *service, mtype *methodType, err error) {
|
||||
dot := strings.LastIndex(serviceMethod, ".")
|
||||
if dot < 0 {
|
||||
err = fmt.Errorf("rpc: service/method request ill-formed: %s", serviceMethod)
|
||||
return
|
||||
}
|
||||
serviceName, methodName := serviceMethod[:dot], serviceMethod[dot+1:]
|
||||
svci, ok := s.serviceMap.Load(serviceName)
|
||||
if !ok {
|
||||
err = fmt.Errorf("rpc: server can't find service %s", serviceName)
|
||||
return
|
||||
}
|
||||
svc = svci.(*service)
|
||||
mtype = svc.method[methodName]
|
||||
if mtype == nil {
|
||||
err = fmt.Errorf("rpc: server can't find method %s", methodName)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func Register(rcvr interface{}) error {
|
||||
return DefaultServer.Register(rcvr)
|
||||
}
|
||||
|
||||
func Accept(lis net.Listener) { DefaultServer.Accept(lis) }
|
||||
|
Reference in New Issue
Block a user