在uni-app中建立socket連接我參考了https://ask.dcloud.net.cn/question/60的內容。並在我的android4.4.4的系統裏測試通過。代碼先貼上如下:
if (plus.os.name == "Android") {
var Socket = plus.android.importClass("java.net.Socket");
var PrintWriter = plus.android.importClass("java.io.PrintWriter");
var BufferedWriter = plus.android.importClass("java.io.BufferedWriter");
var OutputStreamWriter = plus.android.importClass("java.io.OutputStreamWriter");
var BufferedReader = plus.android.importClass("java.io.BufferedReader");
var InputStreamReader = plus.android.importClass("java.io.InputStreamReader");
//測試改良
var StrictMode = plus.android.importClass("android.os.StrictMode");
var Build = plus.android.importClass("android.os.Build");
if (Build.VERSION.SDK_INT > 9) {
var policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
console.log("連接服務器中...")
var socket = new Socket("27.129.167.3", 10000);
socket.setSoTimeout(5000);
var inputStreamReader = new InputStreamReader(socket.getInputStream());
var socketReader = new BufferedReader(inputStreamReader);
var outputStreamWriter = new OutputStreamWriter(socket.getOutputStream());
var bufferWriter = new BufferedWriter(outputStreamWriter);
var socketWriter = new PrintWriter(bufferWriter, true);
socketWriter.println("發送的消息");
var msgBeReceived = socketReader.readLine();
console.log(msgBeReceived);
}
這裏提一下如何判斷服務器斷開:寫入操作始終會成功的,無法判斷服務器是否斷開,只有讀操作,我們可以在var msgBeReceived = socketReader.readLine();處判斷msgBeReceived如果等於null,就認爲服務器斷開。當然此處前提是業務上的確是服務器收到了消息就馬上回返回給客戶端應答狀態,否則JS代碼客戶端是無法判斷服務器已斷開的。
如果不調用setSoTimeout設置SO_TIMEOUT,readLine將一直阻塞直到服務器退出(注意不是斷網)或發送消息。如果服務器斷網,客戶端會卡死在這一步!注意UNI-APP做的APP是單線程的(JS本身就運行在單獨線程裏),這樣頁面會卡死。設置5秒的超時時間,那麼業務上如果頁面操作點擊按鈕發送消息後,建議加上一個請求中的鎖死提示,否則頁面會處於卡死狀態,用戶無法進行任何操作。