這是一個「進一步落後軌道」擴展到我剛纔問的一個問題...我現在對套接字有了更好的理解,並且有一些工作代碼,但需要改進它...如何將相同的數據發送到幾個使用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