2010-01-07 34 views
1

我有4部手機連接到Wifi接入點,我知道所有這些包括Wifi接入點的MAC/IP。JavaME,實現點對點通信

我需要實現每個這些電話之間的通信,一種點對點通信,我正在考慮使用套接字,但每個電話都必須在每個電話上實現一個ServerSocket和套接字,這很好嗎?

這些電話的IP將在私人範圍內192.168 ....所以我可以使用類似http://192.168.xx.xx/port的東西,並聯系任何使用http的電話?我可以使用哪種類來實現這個功能,還是有一個我可以直接使用的現成框架?

回答

2

你打算做什麼就好了:你也可以讓手機在套接字上聽。如果你只是想進行點對點通信,並且對你正在編寫的應用程序更感興趣,那麼你可以看看JXTA,這是一個頗受歡迎的用於Java的P2P系統。我不知道,我聽說過它的一些不好的表現,但是對於你的應用來說,它可能是合適的。

但是推出自己的產品並不是很難。但是,我還沒有看到任何用於Java ME的HTTP服務器端庫,因此使用HTTP可能比所需的工作量多。我可能只是通過TCP套接字實現一個自定義協議,因爲它沒有出現,你需要與已經存在的任何東西進行互操作。

在Java中

的Socket通信ME是通過通用連接框架,在javax.microedition.io包中,並從客戶端是完全一樣使用HTTP連接,即像

String url = "socket://192.168.xxx.xxx:12345"; 
SocketConnection conn = (SocketConnection) Connector.open(url); 

然後你就可以得到InputStreamOutputStream用於連接,或者DataInputStreamDataOutputStream如果要發送二進制數據。

在服務器端,你會做

String url = "socket://:12345"; 
ServerSocketConnection sock = (ServerSocketConnection) Connector.open(url); 
SocketConnection conn = (SocketConnection) sock.acceptAndOpen(); 

acceptAndOpen塊,直到建立連接,所以如果是重要的服務器做其他事情時,請務必把連接接受到其自己的線程。

一個告誡:幾年前當我這樣做時,我發現只聽一個套接字並不能打開所有電話上的網絡,所以即使服務器開始監聽,也無法連接因爲它不在網絡上。我的工作方式是打開手機上的Web瀏覽器,但任何打開套接字的客戶端都已足夠,所以您也可以通過嘗試自己打開客戶端連接來從應用程序中完成。

還有一種叫做Push Registry的東西。創建Midlet時,可以在JAD文件中使用MIDlet-Push屬性註冊該應用程序,以便不必讓應用程序運行,但系統會在某個連接嘗試連接時將其喚醒港口。我從來沒有實現過這個,所以我不能再給出任何建議。

+0

我唯一擔心的是,如果多個對等方(例如3個)試圖查詢一個電話服務器套接字,它將不得不創建3個線程來服務每個服務器,並且我不確定電話有多少個併發線程運行,在這裏我正在談論一個S60,第5版手機,這是相當先進的類,但我沒有這些手機如何處理線程的統計資料。 任何想法都會受到歡迎。 – 2010-01-07 22:36:05

+1

不應該有任何問題有三個,甚至更多的線程在同一時間,但如果他們都使用CPU,它可以減慢應用程序。因此,如果服務包含繁重的處理,一種方法是讓一個線程只進行處理,而通信線程通過單個共享隊列提供;這就是我構建一個應用程序的方式,並沒有任何性能問題。或者如果你真的擔心創建線程,請不要;只需讓服務器連續處理消息,並在客戶端無法連接時實施退避計劃。 – JaakkoK 2010-01-07 23:00:45

+0

非常感謝您的建議,我無法理解您提到的有關在端口上偵聽套接字的警告,爲什麼其他手機無法連接到它?啓動瀏覽器對我來說真的很麻煩!你能否詳細說明你的經驗? – 2010-01-07 23:19:11