首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个引人入胜的java套接字多线程fandango

一个引人入胜的java套接字多线程fandango
EN

Stack Overflow用户
提问于 2011-11-16 08:29:27
回答 1查看 192关注 0票数 2

问候和问候,

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

我相信,随着操作系统对CPU的分时,线程会轮流执行。这是一个问题,因为我需要知道两个InputStreams是否在彼此的一个或两个ms内发送消息。我怎么才能允许这样做呢?

代码语言:javascript
复制
public void run() {
  while (true) {
    try {
      if (input.ready()) {
      String s = input.readLine();
          //do stuff, like comparing socket inputs
      }
    } catch (Exception e) {
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-16 09:21:34

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

我建议你从客户端发送一个带有时间戳的消息,这样它什么时候处理都无关紧要。为了使它更精确,您可以在启动协议时添加一些简单的时间同步,以查找客户端和服务器设备时钟之间的差值。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8145127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档