我是C#的新手,过去主要完成基于网络的编码。我正在创建一个与单个客户端通信的TCP服务器。我知道我需要多个线程,因为我不希望我的程序阻止等待连接(或读取数据,发送等)。
到目前为止,我已经编写了一个简单的测试应用程序,其中包含一个GUI和一个用于与客户端通信的类。主GUI类创建通信类的实例。我在BackgroundWorker中调用了socket.accept,我试图将连接的套接字传递回RunWorkerCompletedEventArgs.Result中的通信类。这没有奏效。我可以打破DoWork方法并看到套接字已连接。然后,我将DoWorkEventArgs.Result设置为连接的套接字,并尝试将其传递回通信类。在RunWorkerCompleted方法中,套接字不再连接。
我可能对如何为单个客户端实现TCP服务器有错误的想法。我见过的所有示例都是为多个客户端设计的,但我将处理单个客户端。我无法控制客户端,只是想与之沟通。
如何将连接的套接字从BackgroundWorker传递回主类,或者更好的方法来构建代码是我需要的。
更新
我不控制客户端。它是一个嵌入式Linux设备。协议非常简单。大小标题后跟数据字节。
目标是.NET 2.0。 WCF似乎仅在.NET 3.0及更高版本上可用。
更新
我的代码将向客户端发送命令并接收数据。我的代码将是一个需要不断发送/接收数据的长期运行的应用程序。
答案 0 :(得分:0)
当你提出其他的设计理念时,我的建议(我在Java和.NET中使用过这种模式)在我的项目中已有4年了,事实证明它非常有效!) 主要思想是:您不应该将套接字返回给主类。您的后台工作程序应该阻塞等待客户端的套接字,一旦它获得连接,它就会循环并从客户端读取数据。后台工作人员将通过thread safe queue将收到的数据包(二进制格式,不要将此处的数据解析为应该是主类的责任)传递给主类。主类可以循环(或更好地使用blocking queue)并通过后台工作程序处理来自客户端的任何新消息。
这样您就可以将代码分成两个不同的层。工人,负责与客户和主要班级交谈,其职责是了解客户所说的内容并可选择地做出回应(仍然通过工人)
编辑从您的编辑中,我看到您使用的是.NET2.0。不幸的是,这个版本的框架没有线程安全的阻塞队列,因为我认为它们是在.NET4中引入的。您仍然可以找到许多基于.NET2的线程安全队列实现