使用hbuild如何实现tcp的socket连接,原生的android可以newsocket = new Socket(ip_addr, ip_port)实现,如果使用hbuild该如何实现???
- 发布:2014-08-19 19:05
- 更新:2019-08-01 21:35
- 阅读:37331
最佳回复
我今天试了一下,可以建立Socket连接了,也能进行数据收发。js代码如下:
function testSocket(){
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 socket = new Socket("192.168.23.8", 8080);
var outputStreamWriter = new OutputStreamWriter(socket.getOutputStream());
var bufferWriter = new BufferedWriter(outputStreamWriter);
var out = new PrintWriter(bufferWriter, true);
out.println("Conneted...");
var inputStreamReader = new InputStreamReader(socket.getInputStream());
var br = new BufferedReader(inputStreamReader);
var msg = br.readLine();
//while(true)
{
if(msg != null)
{
console.log(msg);
}
//msg = br.readLine();
}
}
//console.log(mac);
alert("Done");
}
今天测试了一下最佳评论里面的代码,发现居然报错了!!!
Uncaught android.os.NetworkOnMainThreadException;at new java.net.Socket
不能在主线程调用网络,只能采用异步方式。而且,这个问题出现在Andriod 4.0以上:
Android在4.0之前的版本 支持在主线程中访问网络,4.0以后不支持。
解决方法:
1.通过新的线程访问网络
然后,新的线程访问是不可能了,目前NJS的一块短板,真头疼。
然后看了些文章,说可以用StrictMode来改良异步阻塞问题,于是果断对上面Chuck大神的代码改良了一下。
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);
}
var socket = new Socket("192.168.1.100",9100);
于是,可以了……这里加个Andriod版本判断,可以兼容4.0以上和4.0以上。
谢天谢地解决问题,我终于可以用Andriod手机去调用热敏打印机愉快地打印小票了!
- 首先ios和Android4.4支持websocket,可直接用。
- 对于Android4.4以下,可以使用最佳答案里的Native.js。不过其实现在4.4以下的手机也可以放弃了
- 用socket.io的js库,它会自动屏蔽Android4.4以下不兼容websocket的问题,相关资料自行搜索。
也可以使用、、jq.websocket,连接服务器,我现在的问题是,,怎么在安装app时,启动两个进程,一个运行程序,一个负责socket连接,程序退出后,连接还在不受影响,这样就可以接受到服务端推过来的消息了。
Chuck
不过随之而来的一个问题是:如何开一个线程或者服务来接收服务器端发来的消息。
2015-05-26 19:31
DCloud_heavensoft
回复 Chuck: 期待你继续研究,万一遇到Native.js有bug,爆出来,我们优先解决。
2015-05-27 01:15
Chuck
回复 DCloud_heavensoft:我再捣鼓捣鼓~
2015-05-27 09:21
一切归零
我这边连接的为何创建出来的socket对象一直是null?
2015-11-19 12:59
一切归零
可以了,莫名其妙好了
2015-11-19 17:38
ganjue123
我想问下这个socket有问题为什么还要作为官方插件放在这里??????
2016-04-07 15:56
tutuhuai
为什么客户端接收不到服务端的信息
2016-06-17 11:46
m***@163.com
回复 Chuck:你好啊, thread搞定了吗,有没有解决方法哦,
2016-08-10 10:37
无所不帅
回复 一切归零:你是怎么建立Socket连接的,能进行数据收发吗?
2017-02-15 17:20
h***@163.com
回复 Chuck: 你好问下线程阻塞的解决办法有吗
2019-09-20 12:00