今天做黑莓平臺上J2ME的Socket測試程序,服務端已經調試好了,服務端也用模擬器調試好了,可到了黑莓上面就有問題了,程序運行正常,連接也正常建立,但發送出去的數據服務端就是收不到導致阻塞,服務端阻塞也導致了客戶端接收數據的阻塞。。。死活沒發現原因。。。最后測試來測試去才發現問題所在。
之前的程序:
SocketConnection conn = null;
OutputStream os = null;
InputStream is = null;

try
{
getUrl();

if ("".equals(url.trim()) || "".equals(port))
{
log("請將Socket測試地址和端口填寫完整", Thread.currentThread());
return;
}

try
{
Integer.parseInt(port);

} catch (Exception e)
{
log("端口號必須是整數", Thread.currentThread());
return;
}
log(CONNECTING_STR, Thread.currentThread());
conn = (SocketConnection) Connector.open("socket://" + url + ":" + port, Connector.READ_WRITE, true);
conn.setSocketOption(SocketConnection.LINGER, 5);

// 發送和回復的請求
os = conn.openDataOutputStream();
is = conn.openDataInputStream();
修正之后的程序:
SocketConnection conn = null;
DataOutputStream os = null;
DataInputStream is = null;

try
{
getUrl();

if ("".equals(url.trim()) || "".equals(port))
{
log("請將Socket測試地址和端口填寫完整", Thread.currentThread());
return;
}

try
{
Integer.parseInt(port);

} catch (Exception e)
{
log("端口號必須是整數", Thread.currentThread());
return;
}
log(CONNECTING_STR, Thread.currentThread());
conn = (SocketConnection) Connector.open("socket://" + url + ":" + port, Connector.READ_WRITE, true);
conn.setSocketOption(SocketConnection.LINGER, 5);

// 發送和回復的請求
os = conn.openDataOutputStream();
is = conn.openDataInputStream();
看出來了嗎?
os和is變量的聲明類型不一樣,如果用OutputStream和InputStream這一類的抽象類聲明只能調用標準讀寫接口,在J2ME模擬器上面沒有問題,但是到了黑莓上面死活都不行,后來用了具體實現類來聲明,調用了ReadUTF和WriteUTF來進行讀寫操作,就沒有任何問題了。
---------------------------------------------------------
專注移動開發
Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
posted on 2010-01-10 22:16
TiGERTiAN 閱讀(1933)
評論(1) 編輯 收藏 所屬分類:
Java 、
J2ME 、
BlackBerry