在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秒的超时时间,那么业务上如果页面操作点击按钮发送消息后,建议加上一个请求中的锁死提示,否则页面会处于卡死状态,用户无法进行任何操作。