[英]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.