簡體   English   中英

Java / Android-通過套接字同時發送和接收數據的正確方法

[英]Java/Android - Proper way to send and receive data at the same time through a socket

我目前正在研究一種P2P應用程序的android項目(沒有中央服務器,手動輸入IP地址)。 我已經弄清了兩個設備如何相互連接,但是我似乎很難弄清楚是使用套接字來回發送數據的最佳方法。

現在,我有兩個單獨的線程,一個用於發送數據,一個用於接收數據,因此任何嘗試都不會阻止另一個線程。 我的接收線程檢查輸出流,尋找一個int直到存在。 int是要發送的數據類型的標志,根據該標志,應用程序准備捕獲其余數據,所有這些都是可預測的。

我的問題出現在嘗試設置發送線程時。 我本來打算使用它,以便對Sender對象(Thread的擴展)的調用將僅發送所需的所有數據,但我意識到這樣做實際上並沒有在線程內起作用。

相反,我對其進行了更改,以使線程不斷運行並檢查用於確定將要發送的數據的標志。 從UI線程調用一個函數,該函數將數據准備為類成員,然后設置標志,然后在該標志中由線程“拾取”並發送給其他設備。 但是,我意識到這將占用非常不必要的處理器時間,因為循環將反復檢查該標志。

我只是想知道什么是正確的方法,因為android不允許在UI線程上進行網絡操作。 每次發送消息時,我都必須重寫Sender對象以創建一個新線程嗎?

可以通過wait()暫停發送方線程。 稍后可以通過向它發送notify()來恢復該線程。 發送者的簡短示例是:

synchronized(this){
  wait();
}


synchronized(sender){
  sender.notify();
}

編輯:顯然,在上述情況下,“ this”和“ sender”指的是同一對象(“發送方線程”)。

Edit2:澄清您需要在其中添加這些語句的地方。 根據您的描述,我認為您有以下類似之處

public void run(){
  while(alive){
    // synchronized(this){
    if  (getFlags()!=null){
      //send data
      setFlags(null);
    }
    // wait();}
  }
}

在您的Sender類中。 使用synced and wait,可以防止線程消耗內核中所有可用的cpu資源。 另外,您將需要修改調用線程。 您將添加以下內容:

public void handleEvents(..) {
  // process the event
  // determine what to send
  // synchronized(sender) {
  sender.setFlags(mydata);
  // sender.notify();}
}

注意:如果您在此處修改在發送方線程中訪問的數據,則將需要進一步向上移動同步語句,因為這將阻塞當前線程。 如果發送方阻塞的時間太長,您可以考慮對數據進行排隊(例如,通過擁有對象列表而不只是對象),並在進入同步塊之前檢查布爾值標志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM