server和client通过grpc建立连接

本文介绍了一个基于gRPC的客户端与服务器通信案例,包括如何创建proto文件定义消息结构和服务接口、生成Go语言代码、实现客户端和服务端的具体逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、文件结构

server端和client端分布在两个不同的集群里,可以通过下发mq消息,或者grpc连接传递消息,这里介绍通过grpc建立连接,第一步是创建proto文件,要传递的方法和变量都在这里定义

sendData/
├── data.proto
└── log

二、创建data.proto文件

注意,如果server端和client端不在同一集群,两边都要创建proto文件


syntax = "proto3";            //指定protobuf的版本

package sendData;        //声明一个包名,一般与文件目录名相同

// service里定义建立连接的方法sayHello 
service Connect {
  rpc sayHello (HelloRequest) returns (HelloReply) {}
}

// 定义传递结构体
message HelloRequest {
	string name = 1;
	int age = 2;
	Data data = 3;     //传递的数据的顺序从上到下排列,类型也可以是结构体
}

message Data {
    string phone = 1;
}

message HelloReply {
    string message = 1;  // message在data.pb.go里会变成Message
}

运行:protoc --go_out=plugins=grpc:. data.proto

运行完毕后目录结构
sendData/
├── data.proto
├── data.pb.go
└── log

三、创建client.go
package main

import (
    "log"
    "os"

    pb "amber/sendData"
    "golang.org/x/net/context"
    "google.golang.org/grpc"
)

const (
    address = "localhost:50001"
)

func main() {
    //client端主动发起grpc连接,dial对方
    conn, err := grpc.Dial(address, grpc.WithInsecure())  
    if err != nil {
        log.Fatalf("dial to server with error : %v", err)
    }

    defer conn.Close()        //一定不忘忘记关闭连接

    c := pb.NewConnectClient(conn)
	if c== nil {
        log.Fatalf("connect to server with error : %v", err)
	}
	
	//生成的pb.go里的结构体可以被外部引用
	data:= &pb.Data{Phone:"130-4472-0078"} 
	
    resp, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: "amber",Data:data})
    if err != nil {
        log.Fatalf("could not greet: %v", err)
    }
    
    //打印HelloReply里message的内容
    log.Println(resp.Message)
}


四、创建server.go
package main

import (
    "log"
    "net"

    pb "amber/sendData"
    "google.golang.org/grpc"
    "golang.org/x/net/context"
)

const (
    PORT = ":50001"
)

type server struct {}   //定义空结构体,关联server服务

// 重写SayHello方法
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    log.Println("request: ", in.Name)
    return &pb.HelloReply{Message: "Hello " + in.Name}, nil
}

func main() {
    lis, err := net.Listen("tcp", PORT) //port与client发起dial的一致
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }

    s := grpc.NewServer()
    pb.RegisterConnectServer(s, &server{}) //注册服务到grpc的sever端,RegisterConnectServer是proto里service生成

    log.Println("rpc服务已经开启")

    s.Serve(lis) //建立连接,开始服务
}
在 C# 中实现 GRPC连接,可以按照以下步骤进行: 1. 安装 .NET Core SDK GRPC 工具 首先需要安装 .NET Core SDK GRPC 工具。可以在官网下载安装包,也可以使用命令行工具进行安装。 2. 创建 GRPC 服务客户端 在 Visual Studio 中创建一个 GRPC 服务客户端。可以使用 Visual Studio 的模板进行创建,也可以使用命令行工具创建。 3. 实现长连接逻辑 在服务端客户端代码中,实现长连接逻辑。可以使用 GRPC 提供的流式调用接口,或者使用自定义的长连接逻辑。 4. 启动 GRPC 服务客户端 在服务端代码中启动 GRPC 服务,等待客户端连接。在客户端代码中连接 GRPC 服务,并发送请求。 下面是一个简单的示例代码,实现了 GRPC连接的功能: 服务端代码: ```csharp public class MyService : MyService.MyServiceBase { public override async Task<MyResponse> LongConnect(IAsyncStreamReader<MyRequest> requestStream, ServerCallContext context) { while (await requestStream.MoveNext()) { var request = requestStream.Current; Console.WriteLine($"Received request: {request.Message}"); } return new MyResponse { Message = "Long connection closed." }; } } class Program { static void Main(string[] args) { var server = new Server { Services = { MyService.BindService(new MyService()) }, Ports = { new ServerPort("localhost", 50051, ServerCredentials.Insecure) } }; server.Start(); Console.WriteLine("Server started."); Console.ReadLine(); server.ShutdownAsync().Wait(); } } ``` 客户端代码: ```csharp class Program { static async Task Main(string[] args) { var channel = new Channel("localhost", 50051, ChannelCredentials.Insecure); var client = new MyService.MyServiceClient(channel); var cts = new CancellationTokenSource(); var call = client.LongConnect(cancellationToken: cts.Token); try { while (!call.IsCompleted) { Console.Write("Enter message to send: "); var message = Console.ReadLine(); await call.RequestStream.WriteAsync(new MyRequest { Message = message }); await Task.Delay(1000); } } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { cts.Cancel(); await call.RequestStream.CompleteAsync(); } Console.WriteLine("Long connection closed."); Console.ReadLine(); } } ``` 在上面的示例中,服务端实现了一个名为 LongConnect 的长连接方法,客户端通过调用该方法建立连接,并在循环中发送请求。服务端在收到客户端请求后,将请求内容输出到控制台。客户端在每秒钟发送一次请求,并等待用户输入。当用户输入 exit 命令时,客户端结束循环,并关闭连接
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值