java - 我如何使用 TCP 将相同的数据发送到多个 android 手机?

标签 java android multithreading sockets tcp

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

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

因为据我所知,无法在 TCP 上进行广播 - 我的想法是让手机最初使用 ServerSocket“连接”到服务器应用程序。这只会收集要存储在 Set<InetAddress> 中的客户端 IP 地址。称为客户。然后我将遍历这些地址并将字符串分别发送到每部手机 - 但是我不想阻止代码,也不想永远等待发送发生,如果,比如说,手机已经进入 hibernate 状态,不能/不会接受连接。信息需要在开始发送后的几秒钟内到达所有手机(即使有 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 来说是可以的,它不会让你阻塞执行。因此,即使有大量死客户,活客户也会尽快得到答复。

关于java - 我如何使用 TCP 将相同的数据发送到多个 android 手机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6030041/

相关文章:

c++ - 如何将 TBB task_arena 类与 enqueue 和 wait_until_empty 一起使用

java - 如何验证当前设备中是否存在手机号码

java - 解释 android 加速度计值以获取手机在现实世界中沿轴的平移

android - 如何获得深色的 ActionBarSherlock 主题?

c++ - 多线程在哪个 "level"处最有效?

android - AsyncTask不会在Android 2.3 Andengine中引发异常

java - 函数映射错误

java - Switch 语句关键事件为 1

java - Spring @RequestMapping 绝对路径

android - 从文本输入中获取选中的文本