问候和问候,
我有两个Android应用程序:一个是服务器端,一个是客户端。服务器从两个或多个客户端接收字符串。服务器测试输入的冲突(例如,在1毫秒内接收到的输入)。一旦客户端建立了与服务器的连接,服务器就会实例化一个客户端对象,该对象运行一个while-true线程,以便于接收输入。
我相信,随着操作系统对CPU的分时,线程会轮流执行。这是一个问题,因为我需要知道两个InputStreams是否在彼此的一个或两个ms内发送消息。我怎么才能允许这样做呢?
public void run() {
while (true) {
try {
if (input.ready()) {
String s = input.readLine();
//do stuff, like comparing socket inputs
}
} catch (Exception e) {
}
}发布于 2011-11-16 09:21:34
我认为你会发现更大的问题是,网络层本身就会在时间上引入许多毫秒的变化(只需查看运行ping时的时间范围),这样即使客户端都在完全相同的时刻发送,你也会发现它们通常都会在增量大于几毫秒的时间到达。您还可能遇到与处理传入网络数据有关的其他计时问题,具体取决于无线电硬件,以及位于VM和物理网络之间、发送方和接收方的内核配置。我的观点是,在几毫秒的时间内检测冲突可能是不可能的。
我建议你从客户端发送一个带有时间戳的消息,这样它什么时候处理都无关紧要。为了使它更精确,您可以在启动协议时添加一些简单的时间同步,以查找客户端和服务器设备时钟之间的差值。
如果目标只是知道哪个客户端首先发送了数据,那么您可以假设首先返回的阻塞的input.readline()就是首先发送数据的那个客户端,给定每个客户端具有相似长度和相似ping延迟的数据。这在正常情况下是正确的。为了处理可变长度数据和其他一些与物理网络相关的问题,一个很好的调整方法是进行字节读取,而不是整行读取,这样可以更好地了解谁最先到达,而不是哪个客户端能够更快地发送整个行。
https://stackoverflow.com/questions/8145127
复制相似问题