77 "net"
88 "sync"
99
10+ "github.com/gin-gonic/gin"
1011 "google.golang.org/grpc"
1112
1213 pd "go-learning/practise/grpc/tunnel"
@@ -29,30 +30,32 @@ func (s *server) Connect(stream pd.Tunnel_ConnectServer) error {
2930 log .Printf ("tream.Recv %v" , err )
3031 return err
3132 }
32- log .Printf ("Received from %s: %s" , req .Type , string (req .Payload ))
33-
34- switch req .Type {
35- case "client_call" :
36- // 处理客户端主动调用
37- fmt .Println ("client_call" , req )
38- case "server_call" :
39- // 这是 Server 发起的调用,Client 应返回结果
40- resp := & pd.Response {Result : []byte ("server pong" )}
41- if err = stream .Send (resp ); err != nil {
42- return err
43- }
33+
34+ s .lock .Lock ()
35+ _ , ok := s .clients [req .Type ]
36+ if ! ok {
37+ s .clients [req .Type ] = stream
4438 }
39+ s .lock .Unlock ()
40+
41+ // TODO 目前是DEMO
42+ log .Printf ("Received from %s %s" , req .Type , string (req .Payload ))
4543 }
4644}
45+ func (s * server ) Call (c * gin.Context ) {
46+ _ , _ = s .CallClient (c .Query ("clientId" ), nil )
47+ }
4748
48- func (s * server ) CallClient (clientID string , data []byte ) ([]byte , error ) {
49- stream , ok := s .clients [clientID ]
49+ func (s * server ) CallClient (clientId string , data []byte ) ([]byte , error ) {
50+ stream , ok := s .clients [clientId ]
5051 if ! ok {
5152 return nil , fmt .Errorf ("client not connected" )
5253 }
5354
5455 // 发送调用请求
55- err := stream .Send (& pd.Response {})
56+ err := stream .Send (& pd.Response {
57+ Result : []byte (clientId + " server callback" ),
58+ })
5659 if err != nil {
5760 return nil , err
5861 }
@@ -66,11 +69,22 @@ func main() {
6669 log .Fatalf ("failed to listen %v" , err )
6770 }
6871
72+ cs := & server {clients : make (map [string ]pd.Tunnel_ConnectServer )}
73+
6974 s := grpc .NewServer ()
70- pd .RegisterTunnelServer (s , & server {})
75+ pd .RegisterTunnelServer (s , cs )
76+
77+ go func () {
78+ log .Printf ("grpc listening at %v" , listener .Addr ())
79+ if err = s .Serve (listener ); err != nil {
80+ log .Fatalf ("failed to serve %v" , err )
81+ }
82+ }()
7183
72- log .Printf ("listening at %v" , listener .Addr ())
73- if err = s .Serve (listener ); err != nil {
74- log .Fatalf ("failed to serve %v" , err )
84+ r := gin .Default ()
85+ r .GET ("/ping" , cs .Call )
86+ log .Printf ("http listening at %v" , ":8093" )
87+ if err = r .Run (":8093" ); err != nil {
88+ log .Fatalf ("failed to start http: %v" , err )
7589 }
7690}
0 commit comments