2011-11-16 23 views
2

问候和敬意,一个引人入胜的铆接的java多线程插座居心不良

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

我相信随着CPU的OS分时,线程交替执行。这是一个问题,因为我需要知道两个InputStream是在一个ms还是两个ms之间发送消息。我怎么可以允许这个?


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

回答

3

我认为你会发现更大的问题是,单是网络层将在许多毫秒级的时间引入的变异(只是看的时间范围内运行ping程序时),这样,即使客户都在同一时刻发送,你会发现他们经常都会以大于几毫秒的三角洲时间到达。根据无线电硬件以及位于VM和物理网络之间的内核配置,发送方和接收方都可能遇到与处理传入网络数据相关的其他时间问题。我的意思是,检测几毫秒的时间冲突可能是不可能的。

我建议你发送一个时间戳与来自客户端的消息,以便它处理时无关紧要。为了使它更加准确,您可以在协议启动时添加一些简单的时间同步来查找客户端和服务器设备时钟之间的差异。

如果目标是首先知道哪个客户端发送了数据,那么您可以假设被阻止的input.readline()首先返回的是首先发送数据的数据,给定的数据具有类似的长度和类似的ping延迟每个客户。这将在正常情况下是正确的。为了处理可变长度数据和一些与物理网络相关的其他问题,一个好的方法是做一个字节读取而不是整行,这样可以更好地近似谁先到达,而不是哪个客户端能够到达发送更快的整个线路。