StreamJsonRpc使用TCP数据流通讯
StreamJsonRpc 是微软维护的开源 JSON-RPC 的 .NET 库使用非常方便,常用的操作方式是服务器端通过 JsonRpc 的 Attach 静态函数与一个本地类实例实现对外接口,客户端通过 Attach 方法附加到一个 Stream ,然后调用 Invoke 或 InvokeAsync 函数实现函数的基本操作,详细介绍可参阅https://www.cnblogs.com/willick/p/13233704.html 精致码农 相关文章。 服务器端
此代码在 精致码农 示例基础上进行修改,通过示例可以看到使用 .NET 的 Tcp 模式建立服务器也是很方便的,因为 JsonRpc 的 Attach 函数的形参为 Stream 对象,只需要在收到客户端连接后获取客户端对象的 Stream 传入函数即可。 using StreamJsonRpc; using System; using System.IO.Pipes; using System.Net.Sockets; using System.Threading.Tasks; namespace StreamSample.Server { class Program { static async Task Main(string[] args) { int clientId = 1; TcpListener listener = new TcpListener(System.Net.IPAddress.Any, 6600); listener.Start(); while (true) { Console.WriteLine("等待客户端连接..."); TcpClient client = await listener.AcceptTcpClientAsync(); NetworkStream stream = client.GetStream(); Console.WriteLine(#34;已与客户端 #{clientId} 建立连接"); _ = TcpResponseAsync(stream, clientId); clientId++; } } static async Task TcpResponseAsync(NetworkStream stream, int clientId) { var jsonRpc = JsonRpc.Attach(stream, new GreeterServer()); await jsonRpc.Completion; Console.WriteLine(#34;客户端 #{clientId} 的已断开连接"); jsonRpc.Dispose(); await stream.DisposeAsync(); } static async Task ResponseAsync(NamedPipeServerStream stream, int clientId) { var jsonRpc = JsonRpc.Attach(stream, new GreeterServer()); await jsonRpc.Completion; Console.WriteLine(#34;客户端 #{clientId} 的已断开连接"); jsonRpc.Dispose(); await stream.DisposeAsync(); } } public class GreeterServer { public string SayHello(string name) { Console.WriteLine(#34;收到【{name}】的问好,并回复了他"); return #34;您好,{name}!"; } } }客户端
与服务器端相似,我们在连接到服务器后获取 TcpClient 对象的 Stream 传入 Attach 函数即可,具体代码如下: using StreamJsonRpc; using System; using System.IO.Pipes; using System.Net; using System.Net.Sockets; using System.Threading.Tasks; namespace StreamSample.Client { class Program { static string GetMachineNameFromIPAddress(string ipAddress) { string machineName = null; try { IPHostEntry hostEntry = Dns.GetHostEntry(ipAddress); machineName = hostEntry.HostName; } catch (Exception ex) { System.Console.WriteLine(ex.Message); } return machineName; } static string GetIPAddressFromMachineName(string machineName) { string ipAdress = string.Empty; try { IPAddress[] ipAddresses = Dns.GetHostAddresses(machineName); IPAddress ip = ipAddresses[1]; ipAdress = ip.ToString(); } catch (Exception ex) { System.Console.WriteLine(ex.Message); } return ipAdress; } static async Task Main(string[] args) { TcpClient tcpClient = new TcpClient("192.168.31.67", 6600); var stream = tcpClient.GetStream(); Console.WriteLine("正在连接服务器..."); Console.WriteLine("已建立连接!"); Console.WriteLine("我是精致码农,开始向服务端问好..."); var jsonRpc = JsonRpc.Attach(stream); var message = await jsonRpc.InvokeAsync("SayHello", "精致码农"); Console.WriteLine(#34;来自服务端的响应:{message}"); Console.ReadKey(); } } } 程序运行效果
服务器端
客户端
揭盖式洗碗机的特性1。清洗全封闭洗涤,无需抹布,切断细菌传播路径。2,消毒使用加热和专业洗涤消毒剂,可杀死大肠杆菌,沙氏门菌等病毒。3,干燥洗涤后直接干燥,避免留下的水痕,使餐具更加光滑。4,存储容
是否有必要使用自动洗碗机?为什么餐厅,食堂,酒店需要洗碗机?简单地说,酒店,餐厅采用自动洗碗机,提高洗碗工作效率,减少洗碗工的劳动强度,同时保障了食客的健康。洗碗机和人工洗碗的优势是什么?使用洗碗机洗碗筷,
商用自动洗碗机与人工洗碗对比与人工洗涤相比,洗碗机的洗碗速度具有相当大的优势,并且自动洗碗机的清洁速度甚至可以超过5个洗碗工。食堂洗碗机已成为许多酒店和餐馆所需的厨房设备之一。在水和电力方面,自动洗碗机的平均
商用自动洗碗机的特点一般而言,自动洗碗机包含自动除渣,自动清洁,自动喷淋冲洗,自动烘干等功能,清洁后的餐具可以直接使用。随着中国消费结构的升级,洗碗机已成为家电行业增长较快的类别之一。自动洗碗机进行科
洗碗机和人工洗碗的优势对比为什么餐厅,食堂,酒店等地方需要用到洗碗机?简单地说,酒店餐厅采用自动洗碗机,提高洗碗的工作效率,降低洗碗工的劳动强度,确保食客的健康。洗碗机和人工洗碗的优势是什么?使用洗碗机清洗
宝马X5国产后,一些小问题是否可解决宝马X5即将在沈阳华晨宝马大东工厂生产,国产后轴距会加长7cm,看似长度增加不多,预料车重增加几十公斤,转弯半径与操控也会受到一定影响,但是以国人的大空间的热爱,加长必定压倒一切,
上市10天已卖了六千多辆,深圳首批吉利星越L的车主终于提车了新车上市9月26日,吉利汽车中国星系列的重磅SUV,星越L正式在深圳交车给盼望已久的首批订车用户,这款全新的SUV以超大的车身,豪华的配置以及同级超高的性价比吸引众多消费者的关注,
深圳学院派00后,深三代们更爱新能源汽车,教育必须从娃娃抓起昨天参加了深圳职业技术学院汽车学院学生会和校友会举办的我的中国梦,汽车文化行天下的校内活动,有幸访问了几位新生代00后对汽车的见解,对深圳本土青年轻对新能源汽车以及汽车消费观有了一
备受争议的日产全新奇骏比我想象中好太多了,建议买两驱豪华版周六我在深圳马峦山试驾了全新一代日产奇骏,这是2021年的重磅新车,其外形设计就是我喜欢比较方方正正的模样,车头采用日产家族面谱VMotion3。0设计语言,远近光灯进行了上下分组
奔赴山海再次快乐中国星旗舰家轿星瑞CMA趣味挑战赛上市10个月热销10万,吉利星瑞缔造15万级家轿中国星速度,成功突破中国家轿价值壁垒。星瑞的推出,填补了中国品牌在12万元以上家轿市场的长期空缺,并打破了中国家轿主销价10万元天花
小鹏P5终于公布六款车型的具体价格,补贴后售价15。7922。39万由于疫情原因,下半年多款新车上市发布都选择线上进行,9月15日晚,万众期待的小鹏P5(简称P5)超级发布会正式在线上举行,为要形容何万众期待,因为P5是全球首款搭载激光雷达的量产电