【发布时间】:2020-02-18 13:14:06
【问题描述】:
我正在使用 Visual Studio Express 2013 为移动机器开发一个服务器,该服务器实现了一个套接字服务器来接收它们的连接。
它使用Net.Sockets.TcpListener.AcceptSocket 将连接分配给Net.Sockets.Socket。
它为每个创建的新套接字启动一个新的Threading.Thread,并在一段时间内接收、解析和写入数据到套接字。
它使用属性x.Available 获取数据计数并使用x.Receive(buffer, datalen, Net.Sockets.SocketFlags.None) 读取该数据。
它解析接收到的数据并创建答案。
最后它使用x.Send(answerbuffer, answerdatalen, Net.Sockets.SocketFlags.None) 来传递答案。
代码在接收和发送答案时可以正常工作,但速度很慢。
我对代码进行了一些检查,以获取代码每次操作的经过时间,并得到平均值: - 套接字从缓冲区读取数据并将数据复制到列表(字节):100-200 ms - 数据解析和创建应答缓冲区列表(字节):150-300 ms - 将缓冲区列表(字节)转换为缓冲区字节数组和套接字发送:70-200 毫秒
请记住,数据包的数据接收长度约为 150 字节,数据传输长度约为 100 字节,线程的每个执行部分的时间都非常高。因此,当服务器同时接收到更多连接时,响应速度会变慢或停止一段时间。
这种为服务器上的每个连接使用 Socket 和 Thread 的方法是否不好? 我是否要搜索其他类来管理数据流或线程并行执行? Visual Studio Express 在使用线程方面是否有一些限制?
感谢您的帮助。 马特奥
【问题讨论】:
-
如果这些是临时连接,使用 AcceptSocketAsync 可能会快得多,因为这将使用线程池。
标签: .net multithreading sockets visual-studio-2013