我正在使用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毫秒-数据解析和创建应答缓冲区列表(以字节为单位):150-300毫秒-将(字节的)缓冲区列表转换为缓冲区的字节数组和套接字发送:70-200 ms
请记住,数据包的数据接收约为150个字节长,数据传输的数据约为100个字节长,线程的每个执行部分的时序都很高。因此,当服务器收到更多的连接时,答案会变慢或停止一会儿。
在服务器上为每个连接使用套接字和线程的这种方法不好吗?是否搜索其他类来管理数据流或线程并行执行?Visual Studio表达在使用线程方面有一些限制吗?
谢谢您的帮助。Matteo
这种在服务器上为每个连接使用套接字和线程的方法不好吗?
是的,非常糟糕。线程根本无法扩展,此外:如果每个套接字使用线程,则几乎可以保证意外或恶意的DDOS。
您可以大约如果仅连接到几个套接字,那么就不必在客户端使用每线程线程数。在服务器上:那简直就是死亡。
服务器套接字IO几乎总是使用异步IO完成的。这变得非常复杂[[really fast]],尤其是在谈论后台缓冲区等问题时,但是:在这种情况下,现代.NET中提供了一个全新的API:“管道”-处理所有线程,内存池,以及后缓冲管理for you。但是,[SocketAsyncEventArgs
,但同样:这是一个[[真的很深的兔子洞