2011-05-17 33 views
2

这是一个“进一步落后轨道”扩展到我刚才问的一个问题...我现在对套接字有了更好的理解,并且有一些工作代码,但需要改进它...如何将相同的数据发送到几个使用TCP的android手机?

好的,所以我现在已经有了UDP多播工作机制,可以将短串文本从Java“服务器”应用程序发送到几个Android手机(这可能会成为几百部Android手机)。这在大多数情况下都可以正常工作,但它确实倾向于在奇数手机上丢失奇怪的字符串,并随机在短时间内完全丢失,而且没有任何信息会传递给任何人,这可能有点令人沮丧。

因为,据我所知,没有办法在TCP上进行广播 - 我的想法是使用ServerSocket将手机最初连接到服务器应用程序。这只会收获客户端IP地址,这些IP地址将被存储在名为的客户端Set<InetAddress>中。然后,我将要遍历这些地址并将字符串分别发送到每个电话 - 我不想阻止代码,也不希望花费永远等待发送发生,如果手机有去睡觉,不能/不会接受连接。这些信息需要在开始发送后几秒钟内到达所有电话(即使是2-300个客户端也是如此)。

我最初的代码如下,我已经把它的问题是:

  • 这段代码在一个线程就够了吗?
  • 一个现代的CPU能够很好地利用几个线程,地址集在它们之间均匀分配(比如说4个线程?)
  • 是的(我相信)是一个不错的主意,让每个连接/自己发送线?
  • 设置套接字超时是否允许线程更快地处理其列表?或者这会导致问题?
  • 如果套接字超时设置是一个好主意,那么什么是合理的时间?或者我需要测试才能正确使用?

预先感谢任何帮助你们能提供...

for (InetAddress client : clients) { 
try { 
    Socket sendQuestionSocket = new Socket(client, portSend); 
    // Theory: 50 milliseconds is enough to connect, and could allow 200 clients 
    // to get their questions in around 10 seconds. Maybe? 
    sendQuestionSocket.setSoTimeout(50); 
    PrintWriter outStream = new PrintWriter(sendQuestionSocket.getOutputStream()); 
    outStream.println(question.toString()); 
    outStream.flush(); // Do I need this line? 
    sendQuestionSocket.close(); 
    outStream.close(); 
} catch (InterruptedIOException e) { 
    logger.log(Level.WARNING, "Couldn't connect in time... passing this one over"); 
    e.printStackTrace(); 
} catch (UnknownHostException e) { 
    logger.log(Level.SEVERE, "Unable to find that client"); 
    e.printStackTrace(); 
} catch (IOException e) { 
    logger.log(Level.SEVERE, "Unable to create question sending port"); 
    e.printStackTrace(); 
} 

}

+0

只是想知道如何管理发送数据*到*电话,因为他们的IP地址在互联网上一般不可见。许多GSM提供商在专用网络中都有他们的客户并使用NAT(或类似的东西)。 – 2011-05-17 11:36:42

+0

嗨安德烈亚斯,手机连接到当地的WIFI网络,它完全独立于GSM网络......尝试在新西兰使用GSM数据网络将是非常昂贵的... – Steve 2011-05-17 21:03:46

回答

1

我会去与这里的线程:一个线程为每个客户端。现代的CPU可以,它不会让你阻止执行。所以,即使有很多死客户,活的客户也会尽快得到答案。

+0

谢谢你 - 我只是看了看周围,发现这个线程:http://stackoverflow.com/questions/763579/how-many-threads-can-a-java-vm-support所以你可能就在那里。当我今天有机会看到有多少连接线程可以运行到缺少客户端,然后再进入“服务器”之前,我会给出一个答案......干杯 – Steve 2011-05-17 21:15:02

1

我不确定你想要做的事情会起作用。 ServerSocket不允许您收集远程IP地址,只需在需要时连接。为了连接回这些设备,他们必须让服务器监听特定端口并接受您的传入连接。

由于好像您已经有客户端连接到您的服务器套接字,我只会告诉他们他们需要知道的任何连接之后 - 除非您真的可以在每部手机上都有服务器。

另一种选择是使用(无连接)UDP,但客户端代码仍然需要主动等待数据报包。

在Java中做任何事情时,我都强烈建议Netty。 Netty将为您处理所有异步网络IO,并让您专注于客户端连接后要执行的操作。

+0

谢谢,但我不明白你的意思是由ServerSocket不在那里让我收集IP地址 - 它的工作原理是这样的。客户端实际上一直在积极监听文本 - 我有一个接收器线程正在侦听UDP多播数据包 - 但问题是如上所述的可靠性问题。我将看看Netty,但我将它用作Java网络学习练习,因此用“黑盒子”代替我的网络代码对我来说并不理想。干杯 – Steve 2011-05-17 21:06:23

+0

虽然你**可以**使用ServerSocket收集远程地址,但这不是它的主要目的。为什么要建立一个TCP连接来收集远程客户端的IP地址?您已经在使用UDP回到“客户端”电话。只需使用UDP进行服务器注册步骤即可。 Netty不是黑匣子。它是一个放置在Java NIO类之上的Facade,用于隐藏我发现的Java NIO API的复杂性,难以使用。它非常强大,可以让你非常容易地异步执行任务。使用它只是一个建议。 :) – alpian 2011-05-17 22:56:04

+0

感谢您的回应......我正在使用它来确保客户端应用程序正在与正确的服务器交谈。它是一个认证系统的一部分,但还不完整......但它确保客户端应用程序使用正确的端口进行侦听,并了解服务器IP地址以发送响应。我已经开始阅读Netty了,它看起来很有趣 - 我同意NIO - 我开始关注它,并放弃了一段时间:) – Steve 2011-05-18 05:45:03

相关问题