这是一个“进一步落后轨道”扩展到我刚才问的一个问题...我现在对套接字有了更好的理解,并且有一些工作代码,但需要改进它...如何将相同的数据发送到几个使用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();
}
}
只是想知道如何管理发送数据*到*电话,因为他们的IP地址在互联网上一般不可见。许多GSM提供商在专用网络中都有他们的客户并使用NAT(或类似的东西)。 – 2011-05-17 11:36:42
嗨安德烈亚斯,手机连接到当地的WIFI网络,它完全独立于GSM网络......尝试在新西兰使用GSM数据网络将是非常昂贵的... – Steve 2011-05-17 21:03:46