热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#实现gRPC通信

目的:实现在一台机器上使用gRPC搭建服务器和客户端环境,并进行一次通信参考博客:https:www.cnblogs.comlinezeropgrpc.html 一、新建项目1、打

目的:实现在一台机器上使用gRPC搭建服务器和客户端环境,并进行一次通信

参考博客:https://www.cnblogs.com/linezero/p/grpc.html

 

一、新建项目
1、打开VS,新建一个名为gRPCDemo的C#类库,在类库项目的properties中选择目标框架为Net Standard 1.5

 

 

 

 

 

2、创建成功后,在解决方案资源管理器中,右键“解决方案gRPCDemo”,点击添加中的新建项目,依此创建两个控制台程序,分别命名为grpcServer、grpcClient,最终解决方案目录如下:

 

 

 

二、定义服务
1、创建定义服务的文件.proto

右击上面创建好黑色的gRPCDemo项目,点击添加 -> 新建项目 ,在名称中直接填写:helloworld.proto

2、打开该创建的文件,定义服务方法,主要定义SayHello rpc 方法。原理如果想看懂建议看开头推荐的两篇博文

//定义服务的代码,放在刚创建的helloworld.proto中

//定义服务的代码,放在刚创建的helloworld.proto中

syntax = "proto3";
package gRPCDemo;
service gRPC {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
string name = 1;
}

message HelloReply {
string message = 1;
}


三、使用GRPC.Tools生成代码
上一步服务定义成功了,我们开始生成客户端和服务端的代码。

1、首先在VS中对3个项目添加工具包引用

右键点击“解决方案gRPCDemo”,点击“管理解决方案的NuGet程序包”,在浏览中分别搜索"Grpc"、"Grpc.Tools"、"Google.Protobuf",然后点击右面项目,全选,再点击安装(也可以用视图 -> 窗口 -> 程序包管理器控制台 中的"Install-Package Grpc"进行这一步,这里不提供这种方法,有兴趣自己百度)。

 

 

 

2、拷贝工具包到文件夹中

(1)首先,系统里找到protoc.exe和grpc_csharp_plugin.exe(位置多半会在C:\Users\Administrator\.nuget\packages\grpc.tools\1.17.1\tools\windows_x64 ,如果不在可以用everything搜索前面的工具名)

 

 

(2)然后在自己的VS工程文件夹中建立一个新文件夹命名为packages , 并将上面找到的.nuget\packages中的“Google.protobuf”、“grpc”、“grpc.tools”文件夹拷贝到我们工程文件夹下的packages里面。

 

 

 

3、使用工具生成代码

(1)在系统中运行cmd,运行下图指令进入到我们的工程文件夹里,也就是packages的上一层

 

 

 

(2)然后编写以下指令并运行:

这里参数需要详细说明一下(摘抄自:入门干货之Grpc的.Net 封装-MagicOnion),在这里卡了很长时间:

1. -I 指定一个或者多个目录,用来搜索.proto文件的,如果不指定,那就是当前目录,因为-I已经指定了。

2、 --csharp_out 用来生成C#代码,当然了还能cpp_out、java_out、javanano_out、js_out、objc_out、php_out、python_out、ruby_out 这时候你就应该知道,这玩意就是支持多语言的,才用的,生成一些文件,然后给各个语言平台调用。参数1是输出路径,参数2是proto的文件名或者路径。

3、--grpc_out 到这里可能有人会懵逼,咋回事?C#不是有一个自己的输出目录么?怎么又一个输出?

csharp_out是输出类似于咱们平时写的实体类,接口,定义之类的。生成的文件叫,额,就叫xxx.cs吧.

grpc_out是跟服务相关,创建,调用,绑定,实现相关。生成的玩意叫xxxGrpc.cs。 对比上个选项生成的文件名,大概能了解个十之八九吧。

4、--plugin=protoc-gen-grpc=grpc_csharp_plugin.exe 这个就是c#的插件,python有python的,java有java的。必须要指定它。

 

 

 

以上指令回车运行即可,这里需要说明具体的文件夹路径还是要改一下,因为每个人文件所在目录是不同的,这里要注意,否则cmd会告诉你找不到指定路径

packages\grpc.tools\1.17.1\tools\windows_x86\protoc.exe -IgRPCDemo --csharp_out GRPCDemo gRPCDemo\helloworld.proto --grpc_out gRPCDemo --plugin=protoc-gen-grpc=packages\grpc.tools\1.17.1\tools\windows_x86\grpc_csharp_plugin.exe
执行完之后,就可以看到目录下多了很多生成的文件

 

 

 

(3)添加工程,在VS里项目右键-> 添加 -> 现有项目 ,然后选择刚生成的文件进去就可以了;

(4)引用项目:在gRPCSever和gRPCClient项目中分别引用gRPCDemo,操作是右击项目的依赖项->添加引用 -> 解决方案 -> 点击gRPCDemo ,确定即可。

四、创建客户端和服务端
1、创建服务端:

在gRPCSever项目里打开program.cs,复制进去一下代码:

//服务端代码

using Grpc.Core;
using GRPCDemo;
using System;
using System.Threading.Tasks;

namespace gRPCServer
{
class severProgram
{
const int Port = 9007;

public static void Main(string[] args)
{
Server server = new Server
{
Services = { gRPC.BindService(new gRPCImpl()) },
Ports = { new ServerPort("localhost", Port, ServerCredentials.Insecure) }
};
server.Start();

Console.WriteLine("gRPC server listening on port " + Port);
Console.WriteLine("任意键退出...");
Console.ReadKey();

server.ShutdownAsync().Wait();
}
}

class gRPCImpl : gRPC.gRPCBase
{
// 实现SayHello方法
public override Task SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply { Message = "Hello " + request.Name });
}
}

}
2、创建客户端:

在gRPCClient项目里打开program.cs,复制进去一下代码:

//客户端代码

using Grpc.Core;
using GRPCDemo;
using System;

namespace gRPCClient
{
class Program
{
static void Main(string[] args)
{
Channel channel = new Channel("127.0.0.1:9007", ChannelCredentials.Insecure);

var client = new gRPC.gRPCClient(channel);
var reply = client.SayHello(new HelloRequest { Name = "Zhang San" });
Console.WriteLine("来自" + reply.Message);

channel.ShutdownAsync().Wait();
Console.WriteLine("任意键退出...");
Console.ReadKey();
}
}
}
3、生成项目文件:右击gRPCClient和gRPCSever分别生成

4、用vs打开项目,如下图配置,运行

 

 

 

结果是这样的服务(运行完别关闭窗口,服务需要一直运行):

 

5、再用vs第二次打开该项目,如下图配置,运行

 

 

 

结果就再服务端调用了信息并返回到客户端,结果如下:

 

 

 

 

截止到现在,成功实现利用gRPC进行通信。



推荐阅读
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • restful是这些年的高频词汇了,各大互联网公司也都纷纷推出了自己的restfulapi,其实restful和thrift,grpc类似,就是一种协议,但是这种协议有点特殊的就是 ... [详细]
  • 本文介绍了如何使用Node.js通过两种不同的方法连接MongoDB数据库,包括使用MongoClient对象和连接字符串的方法。每种方法都有其特点和适用场景,适合不同需求的开发者。 ... [详细]
  • Asynchronous JavaScript and XML (AJAX) 的流行很大程度上得益于 Google 在其产品如 Google Suggest 和 Google Maps 中的应用。本文将深入探讨 AJAX 在 .NET 环境下的工作原理及其实现方法。 ... [详细]
  • Fiddler 安装与配置指南
    本文详细介绍了Fiddler的安装步骤及配置方法,旨在帮助用户顺利抓取用户Token。文章还涵盖了一些常见问题的解决方案,以确保安装过程顺利。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 本文详细介绍了如何在Azure DevOps Services和Azure DevOps Server中调整时区设置,以及这些设置对不同功能的影响。 ... [详细]
  • 本文深入探讨了Go语言中的接口型函数,通过实例分析其灵活性和强大功能,帮助开发者更好地理解和运用这一特性。 ... [详细]
  • 5分钟学会 gRPC
    5分钟学会gRPC-介绍我猜测大部分长期使用Java的开发者应该较少会接触gRPC,毕竟在Java圈子里大部分使用的还是DubboSpringClound这两类服务框架。我也是 ... [详细]
  • 交换机配置:intg100unshintvlani1ipadd192.168.56.177qstelseuser-iv4authaaaproinsshupl3qsshuserpyt ... [详细]
  • 微服务之总体架构篇
    一、单体架构存在的问题缺点:1、难以维护:当单体应用业务不断迭代后代码量非常臃肿,模整个项目非常复杂,每次更改代码都可能带来新的bug;2、部署项目麻烦:庞大之后项目部署效率 ... [详细]
  • Nginx 启动命令及 Systemctl 配置详解
    本文详细介绍了在未配置和已配置 Systemctl 的情况下启动 Nginx 的方法,并提供了详细的配置步骤和命令示例。 ... [详细]
  • 调试利器SSH隧道
    在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有