当前位置: 首页 > 知识库问答 >
问题:

套接字上的线程太慢

於宾白
2023-03-14

我正在为移动机器开发一个服务器,该服务器使用Visual Studio Express 2013实现套接字服务器以接收其连接。

它使用Net.Sockets.TcpListener.AcceptSocket将连接分配给一个Net.Sockets.Socket。它为每个创建的新套接字启动一个新的Threading.Thread,并有一个while周期来接收、解析和写入数据到套接字。它使用属性x.Available获取数据计数,并使用x.Receive读取该数据。它解析接收到的数据并创建答案。最后它使用x.Send(应答缓冲区、应答数据、Net.Sockets.SocketFlags.None)来传输答案。

代码在接收和发送答案时工作正常,但速度很慢。

我对代码进行了一些检查,以获得代码每次操作所用的时间,并得到了平均值:-套接字从缓冲区读取并复制数据到(字节)列表:100-200毫秒-数据解析和创建应答缓冲区列表(字节):150-300毫秒-将缓冲区列表转换为(字节)缓冲区数组,然后套接字发送:70-200毫秒

请记住,数据包的数据接收长度约为150字节,数据传输长度约为100字节,线程每个执行部分的时间都很高。因此,当服务器接收到更多的连接时,答案会减慢或停止一段时间。

这种为服务器上的每个连接使用Socket和Thread的方法不好吗?我是否要搜索其他类来管理数据流或线程并行执行?Visual Studio Express对使用线程有一些限制吗?

谢谢你的帮助。马提欧


共有1个答案

简学文
2023-03-14

这种对服务器上的每个连接使用套接字和线程的方法是否不好?

是的,非常糟糕。线程根本无法伸缩,另外:如果您在每个套接字上使用线程,则实际上可以保证会出现意外或恶意DDOS。

如果您只连接到几个套接字,您几乎可以在客户端摆脱每个套接字的线程。在服务器上:那只是死亡。

服务器套接字IO几乎总是使用异步IO来完成。这很快就变得复杂了,尤其是当谈到后台缓冲等时,但是:在modern中有一个全新的API可用。NET的这个场景:“管道”——为你处理所有的线程、内存池和后台缓冲管理。不过,它真的不能在Visual Studio 2013上运行,所以...可能的话更新?如果你感兴趣的话,我有一篇关于使用管道的文章。

如果这不可能,那么一个好的起点可能是类似SocketAsyncEventArgs的东西,但同样:这是一个非常深的兔子洞,坦白地说,它基本上是一个已解决的问题。如果您可以切换到预滚装实现,我建议您这样做。

 类似资料:
  • 这是我的客户端和服务器的代码。 class Client1{Client1(int no){try{String message;message=“Hello this is client”+no;byte[]b=message.getBytes();DatagramPacket dp=new DatagramPacket(b,b length,inetAddress.getLocalHost()

  • 我是Java和JavaFX的新手,所以请原谅我的新手问题。在过去的几天里,我一直在寻找我正在努力做的事情的例子,但是没有找到任何答案。下面是我正在尝试做的:我试图创建一个简单的javafx GUI客户端套接字应用程序,使用场景生成器连接到服务器并发送/接收数据。很简单,但是当我试图在JavaFX中实现它时,我的图形用户界面冻结了。我研究发现,原因是套接字通信占用了所有的时间,javafx GUI无

  • 我有一个类似的问题,但是我知道当我要求阅读一行时,发件人应该发送一个行尾。 让我困惑的是,在调试中,它是有效的。可能是因为我在调试时跳过的顺序(直到现在我都不知道这会有什么不同),但我想更好地理解它。 我已经使用线程,但不是很多。 这是我的服务器类: 线程(基于此) 和客户: 它似乎在某个地方进入了死锁,出于某种原因,除非在调试中运行,否则永远不要在向客户端发送数据的服务器类上输入该死锁 (顺便说

  • 我在一台16核NUMA机器上用Red Had Linux对一个Java程序进行了基准测试。我测量了Java DatagramSocket(用于UDP)的吞吐量,即每秒能够接收和发送多少数据包(64字节大小)。这个程序由一个套接字和n个监听套接字的线程组成。当数据包到达时,它们会将有效负载复制到byte[]数组中,用该数组创建一个新的DatagramPacket,并直接将其发送回它的来源。可以把它想

  • 问题内容: 如果我有多个Java线程同时写入同一Socket实例,这会影响从同一套接字读取的对象的完整性吗?即,对象的内容是否会被弄乱等等。对象的顺序可以是随机的。 问题答案: 通常,没有任何保证。一点点不同的对象很可能最终会在电线上交错,使结果难以辨认。 因此,您需要提供外部同步。 有趣的是,即使在OS级别进行单个套接字写入也不一定是原子操作。有关进一步的讨论,请参见注意sendmsg()系列函

  • 问题内容: 我正在尝试在C中创建一个多线程服务器- 客户端文件传输系统。有些客户端将发送或列出或做其他选择(在交换机的情况下,您可以看到),而服务器则存储文件并提供大量服务客户。 就我所知,多线程意识形态确实很困难。它需要太多的经验而不是知识。我已经在该项目上工作了一个多星期,但我一直无法解决这些问题。 有4个选择:第一个是在其目录中列出客户端的本地文件,第二个是在客户端和服务器之间传输的列表文件