J2ME網路連線參考

2021-04-18 18:33:41 字數 2883 閱讀 9565

j2me提供了httpconnection和socketconnection。前者從api級提供了對http協議的支援,而後者只是單純的乙個socket流api。

實際上對於使用http協議的上層應用來說,網路層使用http或者socke應該是透明的。作為框架,應該為使用者提供方便的選擇方式。

j2me中對http 1.2中定義的keepalive支援得並不是很好,並不能獲得乙個http的長連線。對於jse中http connection的實現還沒驗證。

使用socket的乙個好處是可以避免為每個網路請求建立單獨的connection。並且因為socket的inputstream, outputstream是雙工的方式工作,所以可以連續的傳送網路請求而不必等待網路回應。

如果讓socket的inputstream/outputstream以雙工的方式工作(即:通過outputstream傳送之後不等待 inputstream的response),那麼需要應用層的協議進行支援。比如,需要對發出的網路請求進行編號,這樣從inputstream中獲得 response的時候可以把這個回應匹配到正確的請求上。實現雙工,很直接的想法是inputstream、outputstream分別由單獨的乙個執行緒處理。

這個工具包應該能夠做到支援:

可以選擇使用socket或是http;

支援同步/非同步(阻塞/非阻塞)傳送請求,提供timeout機制;

清晰的異常定義,方便上層進行錯誤處理。

對於socket是否可用連線池?[對於j2me程式似乎沒有必要]

connection中的receive, send都是阻塞的。如果要實現非同步收發,需要在乙個單獨的執行緒中處理請求。

以下是通過把阻塞的api放在乙個執行緒中執行而獲得的非同步效果。理想狀態下,在到達了timeout事件後,應該把這個執行緒關閉。但是因為這個執行緒中存在阻塞方法,所以不能及時地獲得停止通知(很難終止這個執行緒)。這個網路請求很可能會在你設定的timeout時間後獲得網路response。為了處理 timeout之後仍舊獲得網路資料的情況,可以先把非同步請求的資料物件放到乙個佇列中,如果網路回應在timeout之前返回,則從這個佇列中查詢該物件並移走這個物件;  當timeout之後,也應該把這個物件移走(可考慮放到另乙個佇列進行其它的特殊處理),這樣當延遲的網路回應到來後,從佇列中找不到物件,就不做處理。

sendrequestsynch是同步的api。 sendrequest()會呼叫同步方法,因此放在乙個單獨的執行緒中執行。匿名執行緒t啟動之後,通過request.wait()方法,使呼叫 sendrequestsynch()的方法被阻塞。從request.wait()方法恢復之後,判斷是否timeout發生。

public void sendrequestsynch(final networkrequest request, long timeout) throws exception catch (exception e)

log.debug("exit the thread."); }

};t.start();   

log.debug("try to wait for " + timeout);

request.wait(timeout);

if (request.isdelayed()) else }

}

sendrequestasynch是非同步的api。這個是寫作過程中的乙個版本。在review之後發現其中存在同步問題。

synchronized (request)

不是在啟動孫子執行緒tt之後執行。問題在於如果sendrequest(request)在執行到最後是傳送request.notifyall()時,可能還沒有執行

synchronized (request)

。這樣就存在request.wait(timeout)不會被喚醒而超時的問題。

public void sendrequestasynch(final networkrequest request, final long timeout) throws exception catch (exception e) }

};tt.start();

synchronized (request)else }

}catch (exception e)

log.debug("exit the thread."); }

};t.start();    }

應當把sendrequest(request) 放到同步塊中。改正後的**:

public void sendrequestasynch(final networkrequest request, final long timeout) throws exception catch (exception e) }

};tt.start();

log.debug("try to wait for " + timeout + "  " + request.getsequenceid());

request.wait(timeout);

if (request.isdelayed()) else }

}catch (exception e)

log.debug("exit the thread."); }

};t.start();    }

exception的處理還沒有規範起來。許多細節還待完善(post還沒有被支援),... 有任何問題都歡迎指出。

J2ME網路連線中顯示問題的解決辦法

j2me網路連線中顯示問題的解決辦法 出自 在網路程式設計中,有些時候會出現一些在沒有接收到網路資料就顯示介面的,造成介面顯示不符合要求 例如公告顯示,會先顯示公告的背景再顯示公告資訊 這裡提乙個簡單的解決辦法給大家 解決這種情況的方法分成三個步驟 1 在需要顯示的介面中,呼叫傳送網路資料的方法。每...

J2ME 文字滾動

private int tipstringpos screen width 當前字串左邊的位置 private int tipstringspeed 2 字串移動速度 private static final int tipstr left 5 5 左邊消失繪製座標 private static f...

j2me記憶體優化

out momory 一陣天旋地轉記憶體又溢位了。在手機上這種痛苦經常都有,套一句俗話在手機上用記憶體必須勒緊褲腰帶。雖然現在pc記憶體上g都不奇怪,可是在手機上卻只能以k來記,可能某位同志會馬上跳出來說也有上m的,記住中國還不富大多數手機都是低端手機。寫手機程式讓我彷彿回到了dos時代 自我安慰一...