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(); } } } 程序运行效果
服务器端
客户端
咕咚智能专业跑鞋性价比之王跑步作为一种性价比高的运动,不仅可以锻炼全身肌肉,减少脂肪塑形。每次跑步的过程中,都拥有一种汗流浃背的乐趣。虽然每个人都跑过步,但跑鞋却不被很多人重视,甚至有些人穿上一双帆布鞋就开
如何为佳明手表设置跑步训练计划如何在佳明手表中设定训练计划或者设置心率区间,以便训练时可以自动分段执行或自动提醒实际心率是否在设定的心率区间内?比如设定训练计划轻松跑10公里心率区间2快速跑20秒6组心率区间5
跑步训练方法之白色启动计划适用人群初跑者,或以前跑过步最近没有跑但想重新开始的人。代码含义W表示步行,E代表轻松跑,L代表轻松速度稳定的长距离跑。跨步跑(ST)是轻量的20秒快速跑(并非冲刺跑),两次跨步跑
一梦江湖助你摆脱社恐!社交牛X症上身,生活不要太快乐现实社会中,不少人都会有社交恐惧症,但是最近有一位玩家直言在玩了一梦江湖后,让一个社恐直接变成了社交牛逼症。这说出去,或多或少,都能让人产生疑惑真的有那么神奇吗?骗人的吧?但是事实
游戏王决斗链接纯黑魔导卡组快乐加倍,这就是版本新活吗?看过游戏王动画的小伙伴们肯定都知道,武藤游戏的王牌正是他忠诚的仆人黑魔术师(黑魔导)!这一非常经典的怪兽也因为极高的人气而极度得到了极大程度上的增强。时至今日依旧有不少黑魔术师的信
联发科天玑系列SoCAI表现备受好评高能效AI成手机终端最强Buff全面的人工智能(AI)技术正在成为各品牌手机打造差异化的关键,这也对手机厂商提出了更高的要求,同时也给芯片厂商带来新的挑战。联发科在近日展示了一系列的天玑旗舰技术,其中高能效AI颇
天玑开放架构成旗舰机差异化优选,联发科与多家手机厂商全球合作今年夏天,联发科推出了天玑5G开放架构,助力终端厂商打造具备差异化体验的高端5G手机,并宣布终端产品将在下半年陆续上市,消息一出获得了行业高度关注。到了2021年最后一季度,我们回
如何判断手中的客户是不是意向客户?在获得客户资源的时候,我们开始要做的就是看看这个客户是不是你的意向客户,接着再进行归类与开发。如果你不进行这一系列的程序,就开始盲目给客户发邮件与开发,这样遍地撒网,时间一长,就不
外贸中让客户成交,这些你要掌握(一)在外贸中,怎么样让客户与你成交,心理语言思想要掌握什么技巧。这一系列,我们将会分为两个部分来讲,小伙伴们想要成单,那就跟随我们的脚步来看看吧!1心态有多重要?一个老外贸员跟我说,心
如何通过软件来获取B2B目标客户群体我们都知道社交APP在B2B市场营销领域是一个非常关键的存在,现在小编就以多年的经验来告诉你们,如何利用社交APP去精准捕捉客户。要知道你的用户是谁随着科学技术的大力发展,现在在媒
客户没理你,你是不是做了这些?做贸易的时候,做了很多努力,但客户就是不理你,你是不是经历过这样的场景,话不多说,马上来看!1专业是你的必备技能,客户才会信任你。答对当地市场完全不知情,参数不知道,付款方式搞错。