【发布时间】:2014-10-19 12:00:11
【问题描述】:
我想扩展我在 .NET 框架方面的经验,并想构建一个客户端/服务器应用程序。 实际上,客户端/服务器是一个小型的销售点系统,但首先,我想专注于服务器和客户端之间的通信。 将来,我想让它成为一个 WPF 应用程序,但现在,我只是从一个控制台应用程序开始。
2 个功能:
客户收到一个数据集,每 15/30 分钟更新一次价格/新产品的更新
(因此代码将在 Thread.sleep 的 Async 方法中持续 15/30 分钟)。关闭客户端应用程序时,发送一种报告(例如,xml)
在互联网上,我找到了很多示例,但我无法确定哪一种是最好/最安全/性能最好的工作方式,因此我需要一些建议来了解应该实施哪些技术。
客户端/服务器
我想要 1 个服务器应用程序来处理最多 6 个客户端。我读到线程使用大量 mb,也许更好的方法是具有 async/await 功能的任务。
ASYNC/AWAIT 示例
http://bsmadhu.wordpress.com/2012/09/29/simplify-asynchronous-programming-with-c-5-asyncawait/
线程示例
mikeadev.net/2012/07/multi-threaded-tcp-server-in-csharp/
SOCKETS 示例
codereview.stackexchange.com/questions/5306/tcp-socket-server
这似乎是一个很好的套接字示例,但是,修订后的代码不能完全工作,因为并非所有类都包含在内 msdn.microsoft.com/en-us/library/fx6588te(v=vs.110).aspx 这个 MSDN 示例包含更多关于 Buffersize 和消息结束信号的内容。我不知道这是否只是一种“旧方法”,因为在我之前的示例中,它们只是将一个字符串从客户端发送到服务器,仅此而已。
.NET 框架远程处理/WCF 我还发现了一些关于 .NET 和 WCF 的远程处理部分的信息,但不知道我是否需要实现它,因为我认为 Async/Await 的示例还不错。
序列化对象/数据集/XML
在它们之间发送数据的最佳方式是什么?只是一个 XML 序列化程序还是只是二进制文件?
数据集示例 -> XML
stackoverflow.com/questions/8384014/convert-dataset-to-xml
远程处理示例
akadia.com/services/dotnet_dataset_remoting.html
如果我应该使用 Async/Await 方法,在 serverapplication 中这样的事情是否正确:
while(true)
{
string input = Console.ReadLine();
if(input == "products")
SendProductToClients(port);
if(input == "rapport")
{
string Example = Console.ReadLine();
}
}
【问题讨论】:
-
这是一个 TCP 练习吗?如果没有,请使用更高级别的协议,例如 Web 服务或 HTTP。 TCP 编程非常难。
-
我只是想以一种高效的方式将数据从服务器发送到客户端。
-
首先,这似乎是两个完全不同的问题:“使用哪个网络 API?”和“如何序列化数据?”它们是相关的,但不是完全相同的问题。其次,在现代 C# 程序中,我会选择第一个选项:使用 TcpClient/TcpListener 进行异步/等待。你可能想也可能不想精确地遵循这个例子,但这似乎是一个很好的起点。更重要的是,async/await 提供了一种非常干净和简单的方法来处理这个确切的场景。绝对不要使用线程示例;这是效率最低、可扩展性最低的方法。
-
我推荐SignalR。
-
我认为 SignalR 更适合实时应用程序。感谢@PeterDuniho 的提示,我会制定这个例子!
标签: c# multithreading asynchronous client-server tcpclient