c# - 单客户端 TCP 服务器模型

标签 c# multithreading sockets tcp backgroundworker

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

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

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

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

更新:

我不控制客户。它是一个嵌入式 Linux 设备。该协议(protocol)非常简单。大小 header 后跟数据字节。

目标是 .NET 2.0。似乎 WCF 仅适用于 .NET 3.0 及更高版本。

更新:

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

最佳答案

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

这样您就可以将代码分成两个不同的层。负责与客户交谈的工作人员和负责理解客户所说内容并有选择地回应(仍然通过工作人员)的主要类(class)

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

关于c# - 单客户端 TCP 服务器模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11367930/

相关文章:

javascript - 如何在 Razor View 中的服务器端代码之间编写 JavaScript?

c# - 从 JSON 字符串反序列化异常

linux - pthreads:不同线程数的不同行为

java - 如何监听套接字输入而不阻塞其他请求

c# - C#中如何比较字符

c# - 如何检查两个.wav文件是否包含相同的声音数据?

c# - 书中的短语 "The current SynchronizationContext is a property of the current thread"是否正确”?

c++ - 套接字,请求http网页

java - Try/catch block 带有 while 语句,用于处理套接字数据,不会继续。没有明显的错误(我认为)

python - Python py2neo SocketError : Connection Refused