gpt4 book ai didi

java - 一个引人入胜的 java socket 多线程 fandango

转载 作者:搜寻专家 更新时间:2023-11-01 09:11:19 25 4
gpt4 key购买 nike

问候和称呼,

我有两个 Android 应用程序:一个是服务器,一个是客户端。服务器从两个或多个客户端接收字符串。服务器测试输入的冲突(例如在 1 毫秒内接收到的输入或其他)。一旦客户端与服务器建立连接,服务器就会实例化一个客户端对象,该对象运行一个 while-true 线程,以促进输入接收。

我相信通过 CPU 的操作系统分时,线程交替执行。这是一个问题,因为我需要知道两个 InputStreams 是否在一两毫秒内发送消息。我怎么可能允许这样做?


public void run() {
while (true) {
try {
if (input.ready()) {
String s = input.readLine();
//do stuff, like comparing socket inputs
}
} catch (Exception e) {
}
}

最佳答案

我认为您会发现更大的问题是,仅网络层就会引入几毫秒的时间变化(只需查看运行 ping 时的时间范围),这样即使客户端全部发送在同一时刻,您会发现它们通常都会以大于几毫秒的增量到达。您还可能会遇到与处理传入网络数据相关的其他时序问题,具体取决于发送方和接收方的 radio 硬件以及位于 VM 和物理网络之间的内核配置。我的观点是,用几毫秒的时间检测碰撞可能是不可能的。

我建议您从客户端发送一个带有消息的时间戳,这样它何时处理就无关紧要了。为了使其更加准确,您可以在协议(protocol)启动时添加一些简单的时间同步,以找到客户端和服务器设备时钟之间的差异。

如果目标只是知道哪个客户端先发送数据,那么您可以假设第一个返回的阻塞 input.readline() 是第一个发送数据的,给定每个客户端的相似长度和相似的 ping 延迟客户。这在正常情况下是正确的。要处理可变长度数据和与物理网络相关的许多其他问题,一个很好的调整是进行字节读取而不是整行读取,这使您可以更好地估计谁先到达而不是哪个客户端能够以更快地发送整条线路。

关于java - 一个引人入胜的 java socket 多线程 fandango,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8145127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com