Logo
Section 1 / 8

使用可空类型与 Protobuf

学习如何在 Protobuf 中使用可空数据类型。

导入

使用可空类型与 Protobuf

学习如何在 Protobuf 中使用可空数据类型。

No configuration found for ID: 3475a7db74d69a65225e396d214353312304808ac2cd6698fc0e7c9120220115

1syntax = "proto3"; 2 3option csharp_namespace = "BasicGrpcService"; 4 5import "google/protobuf/wrappers.proto"; 6 7package basic_grpc_service; 8 9service Chatbot { 10 rpc SendMessage (ChatRequest) returns (ChatReply); 11} 12 13message ChatRequest { 14 google.protobuf.StringValue name = 1; 15 google.protobuf.StringValue message = 2; 16} 17 18message ChatReply { 19 google.protobuf.StringValue message = 1; 20 google.protobuf.BoolValue answer_found = 2; 21 google.protobuf.BytesValue reply_in_bytes = 3; 22 google.protobuf.Int32Value message_size_in_bytes = 4; 23 google.protobuf.DoubleValue message_size_in_megabytes = 5; 24}
1using Google.Protobuf; 2using Grpc.Core; 3using System.Text; 4 5namespace BasicGrpcService.Services; 6 7public class ChatbotService : Chatbot.ChatbotBase 8{ 9 private readonly ILogger<ChatbotService> _logger; 10 private readonly IChatHistoryStore _historyStore; 11 12 public ChatbotService( 13 ILogger<ChatbotService> logger, 14 IChatHistoryStore historyStore) 15 { 16 _logger = logger; 17 _historyStore = historyStore; 18 } 19 20 public override Task<ChatReply> SendMessage(ChatRequest request, ServerCallContext context) 21 { 22 _logger.LogDebug("客户端 {Peer} 发送消息。", context.Peer); 23 24 var reply = new ChatReply(); 25 26 if (request.Message?.ToLower().Contains("hello") == true) 27 { 28 reply.Message = $"Hello {request.Name}!"; 29 reply.AnswerFound = true; 30 } 31 else if (request.Message?.ToLower().Contains("help") == true) 32 { 33 reply.Message = "今天我能帮您什么?"; 34 reply.AnswerFound = true; 35 } 36 else 37 { 38 reply.Message = "抱歉,我无法处理您的请求。"; 39 } 40 41 reply.ReplyInBytes = 42 ByteString.CopyFrom( 43 Encoding.ASCII.GetBytes(reply.Message ?? string.Empty)); 44 45 reply.MessageSizeInBytes = reply.ReplyInBytes.Length; 46 reply.MessageSizeInMegabytes = (double)reply.MessageSizeInBytes / (1024 * 1024); 47 48 _historyStore.AddEntry(request.Message, reply.Message); 49 50 return Task.FromResult(reply); 51 } 52}
1using BasicGrpcService; 2using Grpc.Net.Client; 3using System.Text; 4using System.Text.Json; 5 6Console.WriteLine("您的名字是什么?"); 7var name = Console.ReadLine(); 8 9Console.WriteLine($"你好 {name}。现在可以开始聊天了。"); 10Console.WriteLine("随时输入 'exit' 可以退出。"); 11 12using var channel = GrpcChannel.ForAddress("http://127.0.0.1:5100"); 13var client = new Chatbot.ChatbotClient(channel); 14 15while (true) 16{ 17 var message = Console.ReadLine(); 18 19 if (message == "exit") 20 break; 21 22 Console.WriteLine($"消息: {message}"); 23 24 var reply = await client.SendMessageAsync( 25 new ChatRequest 26 { 27 Name = name, 28 Message = message 29 }); 30 Console.WriteLine($"回复: {reply.Message}"); 31 Console.WriteLine($"是否找到答案: {reply.AnswerFound}"); 32 33 var messageBytes = Encoding 34 .UTF8 35 .GetString(reply.ReplyInBytes.ToByteArray()); 36 37 Console.WriteLine($"从字节中获取的回复: {messageBytes}"); 38 Console.WriteLine($"消息大小(字节): {reply.MessageSizeInBytes}"); 39 Console.WriteLine($"消息大小(兆字节): {reply.MessageSizeInMegabytes}"); 40} 41 42Console.ReadKey();

No configuration found for ID: e823cbafd84c753cfcfc14a05899e710f1a678aac32d19c18ae18fad7a5e2683

Protobuf 简介

在 Protobuf 中使用日期和时间