【问题标题】:Model for TCP server for single client单客户端 TCP 服务器模型
【发布时间】:2012-07-06 18:43:22
【问题描述】:

我是 C# 新手,过去主要完成基于 Web 的编码。我正在创建一个将与单个客户端通信的 TCP 服务器。我知道我需要多个线程,因为我不希望我的程序阻塞等待连接(或读取数据、发送等)。

到目前为止,我已经编写了一个简单的测试应用程序,它带有一个 GUI 和一个用于与客户端通信的类。主 GUI 类创建通信类的实例。我在 BackgroundWorker 中有 socket.accept 调用,我试图将连接的套接字传递回 RunWorkerCompletedEventArgs.Result 中的通信类。这一直没有奏效。我可以中断 DoWork 方法并查看套接字已连接。然后我将 DoWorkEventArgs.Result 设置为连接的套接字并尝试将其传递回通信类。在 RunWorkerCompleted 方法中,socket 不再连接。

我可能对如何为单个客户端实现 TCP 服务器有错误的想法。我看到的所有示例都是为多个客户端设计的,但我将处理单个客户端。我无法控制客户端,只是尝试与它进行通信。

如何将已连接的套接字从 BackgroundWorker 传递回主类,或者我需要一种更好的代码结构方式。

更新:

我不控制客户端。它是一种嵌入式 Linux 设备。该协议非常简单。一个大小标头,后跟数据字节。

目标是 .NET 2.0。 WCF 似乎仅在 .NET 3.0 及更高版本上可用。

更新:

我的代码将向客户端发送命令并接收回数据。我的代码将是一个需要持续发送/接收数据的长时间运行的应用程序。

【问题讨论】:

  • 为什么需要手动编程套接字?你不想使用 WCF 吗?
  • 一般来说,单个客户端和多个客户端的服务器没有区别。您可以为每个客户端带来更高的负载。
  • 我建议尝试 Task Parallel Library 而不是 BGW。
  • @abatishchev - 我有兴趣了解如何在 WCF 中执行此操作。您是否有可以推荐的链接来显示此基础知识?谢谢!
  • WCF 为您提供了一种简单的方法来构建服务器-客户端通信,而无需关心网络传输实现。因此,这取决于您要与之交流的客户是什么。如果它也是一个 .NET 应用程序,那就是“小菜一碟”,如果不是,那就更难了。

标签: c# multithreading sockets tcp backgroundworker


【解决方案1】:

当您询问其他设计理念时,这是我过去 4 年在我的项目中的建议(我在 Java 和 .NET 中使用过这种模式),事实证明它非常有效!) 主要思想是:你不应该把你的套接字还给主类。您的后台工作人员应该阻塞等待客户端的套接字,一旦它获得连接,它就会循环并从客户端读取数据。后台工作人员将通过thread safe queue 将接收到的数据包(二进制格式,这里不解析数据,因为它应该是主类的职责)传递给主类。主类可以循环(或更好地使用blocking queue)并通过后台工作程序处理来自客户端的任何新消息。

通过这种方式,您可以将代码分成两个不同的层。工人,负责与客户交谈,主类负责了解客户所说的内容并有选择地响应(仍然通过工人)

编辑从您的编辑中,我看到您使用的是 .NET2.0。不幸的是,这个版本的框架没有线程安全的阻塞队列,因为我认为它们是在 .NET4 中引入的。您仍然可以找到许多基于 .NET2 的线程安全队列实现

【讨论】:

  • Queue.Synchronized 在 .Net 2.0 中可用。 [link]msdn.microsoft.com/en-us/library/…我会通知主线程事件,还是有一个循环检查队列中的新数据包?
  • @JamesCrow 对不起,我的意思是阻塞队列不是线程安全队列:)
  • 我应该可以使用 BackgroundWorker ReportProgress 方法通知主线程有新消息到达。我正在修改我的通信类以在 .Net 2.0 中进行尝试。
猜你喜欢
  • 2011-11-14
  • 1970-01-01
  • 2013-08-20
  • 2012-01-04
  • 2013-02-17
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多