JAVA - 多线程服务器 - 接收和发送之间的延迟

Posted

技术标签:

【中文标题】JAVA - 多线程服务器 - 接收和发送之间的延迟【英文标题】:JAVA - MultiThread Server - Lag Between Receive And Send 【发布时间】:2013-10-07 11:26:21 【问题描述】:

我的多线程 UDP 服务器最多启动 100 个线程。在每个线程中,它连接到外部设备并从每个线程接收数据流。收到它后,我有一个时间窗口,我需要在其中向外部设备发送确认。

在 run() 中接收位。

byte[] receiveData = new byte[2000];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);

在接收后在 run() 中发送位。

DatagramPacket reply = new DatagramPacket(sendData,sendData.length,receivePacket.getAddress(),receivePacket.getPort();
serverSocket.send(reply);

在运行 wireshark 分析网络流量时,我注意到在我的服务器接收到数据流后,它并没有立即发送 ack 包,它需要几秒钟以及与其他设备的其他几次通信,直到确认包被发送到导致设备端超时的设备。

在多线程环境中,服务器在发送数据包之前等待所有线程完成?

因为几乎总是从服务器发出的数据包等待作为输入到服务器的数据包。

socket的读写队列是一样的吗?

提前感谢您的帮助,我快疯了! :)

【问题讨论】:

您的serverSocket 是如何定义的? 创建 100 个线程所允许的带宽是否超过了以太网连接所允许的带宽? DatagramSocket Socket7300 = new DatagramSocket(7300); 没有足够的上下文。接收和发送之间会发生什么?除非您以这种方式编码,否则多线程中的任何内容都不会使服务器在发送之前等待线程完成。并且没有发送和接收缓冲区不同。 dl.dropboxusercontent.com/u/31910411/code2.txt @stonemetal 这是接收和发送之间发生的事情 【参考方案1】:

在多线程环境中,服务器在发送数据包之前等待所有线程完成?

没有。

socket的读写队列是一样的吗?

没有。

您必须在您忽略的线程之间进行一些同步。它甚至可以在 receivePacket 本身中。

【讨论】:

这是我的服务器端 -> dl.dropboxusercontent.com/u/31910411/code.txt 我没有在任何地方使用同步。我是不是该?我唯一要做的就是每次新的通信都添加一个线程,每次线程死亡时我都会减少线程数。最多 100 个。 dl.dropboxusercontent.com/u/31910411/code.txt 展示了一个非常好的复制粘贴架构。 好吧,我是新手。我正在和最好的人一起学习。加/减计数器会是问题的根源吗? @Thelma 在进入多线程程序之前,您真的应该学习如何编写单线程代码。您缺少诸如数组之类的基础知识,而无法编写任何明智的程序。 谢谢你,@Voo 你能给我一些参考资料吗?

以上是关于JAVA - 多线程服务器 - 接收和发送之间的延迟的主要内容,如果未能解决你的问题,请参考以下文章

linux C语言 TCP 多线程 简易聊天室

用java多线程实现服务器与客户端之间的文件传输的代码!!!急!!!!

C#SerialPort多线程发送/接收冲突

java实现多客户聊天功能

java socket多文件传输问题

java 25 - 5 网络编程之多线程实现聊天室