Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用TCP将相同的数据发送到几个android手机?_Java_Android_Multithreading_Sockets_Tcp - Fatal编程技术网

Java 如何使用TCP将相同的数据发送到几个android手机?

Java 如何使用TCP将相同的数据发送到几个android手机?,java,android,multithreading,sockets,tcp,Java,Android,Multithreading,Sockets,Tcp,这是对我刚才问的一个问题的一个“现在更进一步”的扩展。。。我现在对套接字有了更好的理解,并且有一些工作代码,但需要改进 好的,我现在已经有了UDP多播功能,可以将短字符串文本从Java“服务器”应用程序发送到几个Android手机(可能会变成几百个Android手机)。这在大多数情况下都可以正常工作,但它确实会丢失奇数电话上的奇数字符串,并且随机地,它会在短时间内完全丢失,并且任何东西都无法传递给他们,这可能有点令人沮丧 因为,据我所知,没有办法在TCP上广播-我的想法是让手机最初使用服务器套接

这是对我刚才问的一个问题的一个“现在更进一步”的扩展。。。我现在对套接字有了更好的理解,并且有一些工作代码,但需要改进

好的,我现在已经有了UDP多播功能,可以将短字符串文本从Java“服务器”应用程序发送到几个Android手机(可能会变成几百个Android手机)。这在大多数情况下都可以正常工作,但它确实会丢失奇数电话上的奇数字符串,并且随机地,它会在短时间内完全丢失,并且任何东西都无法传递给他们,这可能有点令人沮丧

因为,据我所知,没有办法在TCP上广播-我的想法是让手机最初使用服务器套接字“连接”到服务器应用程序。这只会获取客户端IP地址,这些地址将存储在名为客户端的
集合中。然后我想迭代这些地址,并将字符串分别发送到每部手机-,但我不想阻止代码,也不想永远等待发送发生,比如说,如果手机已进入睡眠状态,无法/不接受连接。信息需要在开始发送的几秒钟内到达所有手机(即使有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();
}

}

我会选择线程:每个客户端一个线程。这对于现代cpu来说是可以的,并且不会让您阻塞执行。因此,即使有很多死客户,活客户也会尽快得到答案。

我不确定您尝试的方法是否有效。ServerSocket不允许您收集远程IP地址并在需要时重新连接。为了连接回这些设备,他们必须有一台服务器监听特定端口并接受您的传入连接

因为看起来你已经有客户端连接到你的服务器插座上了,我只想告诉他们连接后需要知道的一切——除非你真的可以在每部手机上安装一个服务器

另一种选择是使用(无连接)UDP,但客户端代码仍必须积极等待数据报数据包


在Java中做任何与套接字相关的事情时,我强烈推荐。Netty将为您处理所有异步网络IO,并让您专注于客户端连接后的操作。

您想知道如何将数据发送到手机,因为它们的IP地址通常在互联网上看不到。许多GSM提供商的客户都在专用网络中,并使用NAT(或类似的东西)。嗨,Andreas,手机连接到本地WIFI网络,完全独立于GSM网络。。。在新西兰尝试使用GSM数据网络将非常昂贵…谢谢,但我不明白你说的ServerSocket不在那里让我收集IP地址是什么意思-它以这种方式完美工作。客户端实际上一直都在积极地监听文本——我现在有一个接收方线程在监听UDP多播数据包——但正如我前面所说的,问题是可靠性。我将看一看Netty,但我将其用作Java网络学习练习,因此用“黑盒”替换我的网络代码对我来说并不理想。Cheers虽然您可以使用ServerSocket收集远程地址,但这并不是它的主要用途。为什么建立TCP连接只是为了收集远程客户端的IP地址?您已经在使用UDP返回“客户端”电话。只需将UDP用于服务器注册步骤。内蒂不是一个黑匣子。它是一个放在JavaNIO类之上的门面,用来隐藏JavaNIOAPI的复杂性,我发现它很难使用。它非常强大,允许您非常轻松地异步执行操作。使用它只是一个建议。:)谢谢你的回复。。。我使用它来确保客户端应用程序与正确的服务器进行通信。它是身份验证系统的一部分,但还不完全。。。但它可以确保客户端应用程序使用正确的端口进行侦听,并且知道要向其发送响应的服务器IP地址。我开始阅读Netty,它看起来很有趣——我同意NIO的观点——我开始研究它,并放弃了一些时间:)谢谢你——我只是环顾了一下这方面,发现了这条线索:所以你可能就在那里。当我今天有机会的时候,我会试一试,看看在“服务器”出现问题之前,我可以运行多少连接线程到丢失的客户端。。。干杯