2013-03-29 92 views
0

我的公司爲我們的系統創建自己的定製android硬件。多個ServerSockets,多個設備併發送到多個套接字

我們目前有2個android設備需要一起通信並同步它們內部的sqlite數據庫。

我開始編寫自定義套接字協議來解決這個問題。這是基於服務器客戶端模型。但是,當我做了更多的開發時,我發現每個設備都需要運行一個服務器套接字,並且可以在系統中與3個或更多設備進行通信,並且服務器可能會死機或重新啓動或崩潰。

所以我的想法是讓每個設備搜索我存儲在一個數組中的一組端口,並綁定到一個當前可用的端口,當設備檢查並創建我的ServerSocket時。

這意味着可能具有DEVICE1 ServerSocket的(1111)和裝置2具有的ServerSocket(1112)等

然後,每個設備通過多個端口將消息發送。例如:device1遍歷數組並打開客戶端套接字併爲每個端口發送消息: 套接字套接字=新套接字(IP,1112); 發送消息... Socket socket = new Socket(IP,1113); 發送消息... 等

Ofcourse我已經做了這個多線程(由一個android服務運行),所以沒有阻止在android設備的UI線程。

我的問題是,我在做對嗎?或者有沒有更好的方法在Java中來做到這一點?

編輯:

我決定添加一些代碼來解釋我的問題。

我必須通過TCP/IP連接在一起的多臺Android設備,我創建這樣每個設備上一個ServerSocket:

ServerSocket serverSocket = new ServerSocket(4000); 

現在第二個設備嘗試這個時候,它給了我在Java中的錯誤,因爲其他設備正在使用套接字。他們的IP地址類似於172.23.3.128和172.23.3.127。

因此,即使有不同的IP地址,我也從Java那裏得到一個錯誤,說我已經綁定到了那個真正的端口/ IP。這是我不明白的。

回答

1

你還可以:

  • 具有客戶端偵聽特定UDP端口上
  • 有客戶也broadcast到該端口,annoucing他們的存在
  • 一旦客戶接收廣播,他們可以啓動從臨時端口到預定的輔助端口的直接連接 - 通過TCP或UDP。

這是至少它通常是如何做到的。

+0

問題在於,每個客戶端都需要充當服務器。基本上每個設備都會打開一個ServerSocket,每個設備將信息發送到不同的端口。使用UDP,我們仍然處於1個服務器,許多客戶端模型。 –

+0

@Juan,也許你誤會了。所有客戶都做同樣的事情;沒有「服務器」。所有的客戶都播放他們的存在,並聽取他人的廣播。 – jedwards

+0

我相信你是對的。但是,這不起作用。當我在java的特定端口註冊ServerSocket時,我無法再從其他設備註冊到它,我只能從我的客戶端向該端口發送消息。我將添加一些代碼。 –

0

基本上服務器需要運行沒有失敗,你的想法是服務器的中斷。否則,您可以使用單個服務器接受來自幾個客戶端的連接,例如:5000,5001,5002等。

修復每個客戶端的套接字端口。服務器按照您的嘗試打開一個數組。

通過多個端口發送消息意味着什麼?爲每個客戶端使用單個端口,否則您無法識別哪個客戶端正在發送消息。

+0

基本上每個客戶端也需要打開serverSocket。我確實像你說的那樣創建了這個數組,它似乎工作正常。我只是想知道這是否是正確的方向。 –

1

這沒有意義。這些設備必須各自擁有自己的IP地址:它們也不需要不同的端口號。他們都可以使用相同的端口號。

+0

謝謝!你也是對的。 –