在 C# 中实现 TCP/IP JSONRPC 连接 - 需要设计建议
Posted
技术标签:
【中文标题】在 C# 中实现 TCP/IP JSONRPC 连接 - 需要设计建议【英文标题】:Implementing a TCP/IP JSONRPC connection in C# - Need design Advice 【发布时间】:2012-04-28 01:43:53 【问题描述】:我正在通过 TCP/IP 实现 JSON RPC 连接,但我遇到了一个基本问题。目前我正在使用同步方法,效果很好。
我可以发送
"id":1,"jsonrpc":"2.0","method":"Input.Home"
并接收
"id":1,"jsonrpc":"2.0","result":true
这没有问题。当我收到通知时会出现问题。这些可能会在任何时候出人意料地到达。我正在与 XBMC JSON RPC API 交互。如果 XBMC 已发送通知,我会同时收到多个 JSON 请求。例如
"jsonrpc":"2.0","method":"GUI.OnScreensaverActivated","params":"data":null,"sender":"xbmc""jsonrpc":"2.0","method":"GUI.OnScreensaverDeactivated","params":"data":null,"sender":"xbmc"
这会导致 JSON.NET 崩溃,这是可以理解的。我的第一直觉是我需要异步接收这些通知,这样我就不必等到调用下一个方法来接收它们。然而,这使我上面展示的简单示例变得复杂,因为我不能再使用同步调用。即
SendJson(json);
result = ReceiveJson();
有没有一种简洁的方法来实现它而不会使它过于复杂?感谢任何/所有建议。
【问题讨论】:
【参考方案1】:这里是所有阅读的地方。如果你想进入它,这一切都是值得的。 http://msdn.microsoft.com/en-us/library/ms228969.aspx
不过总结一下..
基本上,您需要创建一个实现 IAsyncResult 的对象。这将存储有关您的异步操作的状态,以及完成时的回调。
创建一个可以将您的 IAsyncResult 对象作为输入的方法,并且在该方法返回之前,它应该在您的 IAsyncResult 对象上调用 .SetCompleted()。在此方法中,您可以完成通常所做的工作。
然后您将创建 IAsyncResult 对象的实例(设置其数据和回调),然后调用 Task.Factory.StartNew([YourNewMethod],[YourInstanceOf IAsyncResult])。
这是需要发生的事情的核心。只需确保设置回调并处理异常即可。
如果您想要一个关于我如何使用异步 http 处理程序执行 json-rpc 的工作示例,请查看 http://jsonrpc2.codeplex.com/SourceControl/changeset/view/13061#74311 以及正在调用进程和正在设置异步对象的位置 http://jsonrpc2.codeplex.com/SourceControl/changeset/view/13061#61720
希望对您有所帮助。
【讨论】:
这正是我想要的。谢谢!以上是关于在 C# 中实现 TCP/IP JSONRPC 连接 - 需要设计建议的主要内容,如果未能解决你的问题,请参考以下文章
是否有一个选项或命令可用于禁用/卸载/或停止 linux 中的 tcp/IP 堆栈。需要它在服务器应用程序中实现用户空间 tcp