介绍

Auto.js 使用JavaScript作为脚本语言,目前使用Rhino 1.7.7.2作为脚本引擎,支持ES5与部分ES6特性。
那么autojs如何连接websocket服务端,我首先想到的是查阅官方文档,但是很遗憾并没有在免费版本找到文档,收费版本倒是有方法。

使用AutoJs Pro自带的web.newWebSocket连接WebSocket

function initSocket(url) {
    wss = web.newWebSocket(url, {
        //eventThread: 'this'
    })
    wss.on("open", (res, ws) => {
        toast("连接成功");
        console.log("连接成功")
    }).on("failure", (err, res, ws) => {
        console.log("WebSocket连接失败");
    }).on("closing", (code, reason, ws) => {
        console.log("WebSocket关闭中");
    }).on("text", (text, ws) => {
        console.log("收到文本消息: ", text);
    }).on("binary", (bytes, ws) => {
        console.log("收到二进制消息:");
    }).on("closed", (code, reason, ws) => {
        toast("连接已断开");
    });
}

注意:关闭方法是wss.close(1000, null)
通过上面的方法可以连接到websocket了,但是只有autojs pro版本支持,那么autojs免费版本如何实现呢?
下面介绍2种方法来实现。

通过Java-WebSocket来实现

function initSocket2(url) {
    var WebSocketClient = org.java_websocket.client.WebSocketClient;
    var WSClient = new JavaAdapter(WebSocketClient, { 
        onOpen: function(handshakeData) {
            console.log("onOpen",handshakeData)
        },
        onMessage: function(message) {
            console.log("onMessage",message)
        },
        onClose: function(code, reason, remote) {
            console.log("onClose",code)
        },
        onError: function(ex) {
            console.log("onError")
        }
    },new java.net.URI(url));
    console.log(WSClient);
}

当然在使用此方法前别忘了导入Java-WebSocket包

// 加载jar
runtime.loadJar("./jar/Java-WebSocket-1.5.1.jar");

这种方法虽然可以实现,但需要单独导入jar包。

通过okhttp3实现websocket client

我们可以还通过autojs自带的okhttp3来实现。实际上autojs pro也是okhttp3封装的。

相关文档:
okhttp3文档
WebSocket对象

代码:

function initSocket3(link){
    //创建一个类
    var obj={
        onOpen:function(ws,response){
            console.log('onOpen')
        },
        onMessage:function(ws,text){
            console.log('onMessage',text)
        },
        onClosing:function(ws,code,reason){
            console.log('准备关闭')
        },
        onClosed:function(ws,code,reason){
            console.log('onClosed',code)
        },
        onFailure:function(ws,err,response){
            console.log('onFailure',err)
        },
    }
    //实现接口WebSocketListener,用于监听事件
    listener = new WebSocketListener(obj);
    var client = new OkHttpClient();
    var request = new Request.Builder().url(link).build();
    client.newWebSocket(request, listener);
    client.dispatcher().executorService().shutdown()
    
}

好了,相信通过上面的三种方法你已经可以熟练的使用autojs连接websocket了。

但在这里我还是得说一下遇到的问题:

1.首先在翻阅资料时发现autojs很少相关的js文档,但是autojs是基于Rhino的,所以我们可以搜索Rhino相关的解决方案以及查阅官方文档

2.当你在autojs中使用ui组件input时你必须注意,在使用getText()方法获取值时,你获取到的值,类型并非javaScript String类型,而是android.text.SpannableStringBuilder类型。你可以使用toString方法转化为javaScript中的string类型。实际上我在使用中发现用了toString可以解决一部分问题,但是在将值传入java对象方法中时仍然会报错,如以上中中的request.url(link)以及new java.net.URI(url)都会报错。这可能跟值的原型有关,具体我也不清楚。最后我是通过正则来解决的value.toString().match(/.*/ig)[0]。如果知道原因的小伙伴可以留言哦

补充

上面提交的string类型问题可以使用new String("内容")来解决。

标签: autojs, websocket, rhino

仅有一条评论

  1. 感谢分享,码住。赞一个

添加新评论