【问题标题】:Can't connect to a node js server in Android无法连接到 Android 中的节点 js 服务器
【发布时间】:2013-12-31 19:21:46
【问题描述】:

我正在使用 Titanium SDK 3.1.3 并尝试使用连接到节点 js 服务器的聊天构建应用程序。 到目前为止,我已经尝试了两个不同的模块来做到这一点,但它们都没有任何运气。 我尝试的第一个模块是socket.io-titanijm,我的代码如下所示:

var io = require('socket.io-titanium');
    var socket = io.connect('IP:PORT', {'force new connection':true});
    socket.on('connect', function() 
    {
        // Connected, let's sign-up for to receive messages for this room
        Ti.API.info('connected to socket');
        socket.emit('room', conversationId.toString());
    });

    socket.on('messageReceived', function(data) 
    {
        Ti.API.info('message received');

        try {
            addMessageFromNode(data);
        } catch(e) {
            alert(e);
        }

    });

但我得到了错误:

E/TitaniumModule(19374): Invalid value, expected type Number.
E/V8Exception(19374): Exception occurred at ti:/bootstrap.js:131: Uncaught Error: Invalid value, expected type Number.
E/XMLModule(19374): (KrollRuntimeThread) [1450,1450] Error parsing XML
E/XMLModule(19374): org.xml.sax.SAXParseException: Unexpected token (position:TEXT faa_rzQcGIc9Vzvt...@1:72 in java.io.InputStreamReader@411485a8) 
E/XMLModule(19374):     at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:146)
E/XMLModule(19374):     at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:107)
E/XMLModule(19374):     at ti.modules.titanium.xml.XMLModule.parse(XMLModule.java:82)
E/XMLModule(19374):     at ti.modules.titanium.xml.XMLModule.parse(XMLModule.java:68)
E/XMLModule(19374):     at ti.modules.titanium.network.TiHTTPClient.getResponseXML(TiHTTPClient.java:655)
E/XMLModule(19374):     at ti.modules.titanium.network.HTTPClientProxy.getResponseXML(HTTPClientProxy.java:93)
E/XMLModule(19374):     at org.appcelerator.kroll.runtime.v8.V8Object.nativeCallProperty(Native Method)
E/XMLModule(19374):     at org.appcelerator.kroll.runtime.v8.V8Object.callProperty(V8Object.java:69)
E/XMLModule(19374):     at org.appcelerator.kroll.KrollProxy.handleMessage(KrollProxy.java:1098)
E/XMLModule(19374):     at android.os.Handler.dispatchMessage(Handler.java:95)
E/XMLModule(19374):     at android.os.Looper.loop(Looper.java:137)
E/XMLModule(19374):     at org.appcelerator.kroll.KrollRuntime$KrollRuntimeThread.run(KrollRuntime.java:112)
E/TiHttpClient(19374): (KrollRuntimeThread) [5,1455] Error parsing XML
E/TiHttpClient(19374): org.xml.sax.SAXParseException: Unexpected token (position:TEXT faa_rzQcGIc9Vzvt...@1:72 in java.io.InputStreamReader@411485a8) 
E/TiHttpClient(19374):  at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:146)
E/TiHttpClient(19374):  at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:107)
E/TiHttpClient(19374):  at ti.modules.titanium.xml.XMLModule.parse(XMLModule.java:82)
E/TiHttpClient(19374):  at ti.modules.titanium.xml.XMLModule.parse(XMLModule.java:68)
E/TiHttpClient(19374):  at ti.modules.titanium.network.TiHTTPClient.getResponseXML(TiHTTPClient.java:655)
E/TiHttpClient(19374):  at ti.modules.titanium.network.HTTPClientProxy.getResponseXML(HTTPClientProxy.java:93)
E/TiHttpClient(19374):  at org.appcelerator.kroll.runtime.v8.V8Object.nativeCallProperty(Native Method)
E/TiHttpClient(19374):  at org.appcelerator.kroll.runtime.v8.V8Object.callProperty(V8Object.java:69)
E/TiHttpClient(19374):  at org.appcelerator.kroll.KrollProxy.handleMessage(KrollProxy.java:1098)
E/TiHttpClient(19374):  at android.os.Handler.dispatchMessage(Handler.java:95)
E/TiHttpClient(19374):  at android.os.Looper.loop(Looper.java:137)
E/TiHttpClient(19374):  at org.appcelerator.kroll.KrollRuntime$KrollRuntimeThread.run(KrollRuntime.java:112)

我根本不知道这个 bootstrap.js 文件在哪里,我的项目中不存在这样的文件,所以我相信这是 Titanium SDK 中的一个文件? 我尝试使用的另一个模块是iamyellow's tiws module,为此我使用了以下代码:

var ws = require('net.iamyellow.tiws').createWS();
    ws.addEventListener('open', function() {
        Ti.API.info('websocket opened');
    });

    ws.addEventListener('close', function(ev) {
        Ti.API.info('close');
        Ti.API.info(ev);
    });

    ws.addEventListener('error', function(ev) {
        Ti.API.info('error');
        Ti.API.info(ev);
    });

    ws.addEventListener('message', function(ev) {
        Ti.API.info('message');
        Ti.API.info(ev);
    });

    ws.open('IP:PORT');

但是这个模块根本没有连接,没有错误信息被抛出,我在测试这个模块时彻底检查了logcat,没有发现任何东西。 这些模块不能与 Titanium SDK 3.x 一起使用吗?如果他们这样做了,那么发生了什么?两者都被标记为“易于实施”,但两者的文档都很糟糕,显示的行为也很混乱。

【问题讨论】:

    标签: android websocket socket.io titanium titanium-modules


    【解决方案1】:

    好的,这个有点棘手,但在查看了几张票后,我了解到 Android 上存在超时问题。如果您分配给超时的变量未定义,则它将不起作用。我的意思是,如果你有类似的东西;

    this.timeoutTimer = setTimeout(...); //imagine the variable this is a reference to an object that is storing properties for a connection.
    

    它不会起作用,但是如果你在给 timeoutTimer 属性分配一个空值之前给它分配超时 id,如下所示:

    this.timeoutTimer = null;
    .
    . doing something else
    .
    this.timeoutTimer = setTimeout(...);
    

    它可以正常工作。

    注意这一点,这只是一个 Android 问题,iOS 不会出现这个问题,但如果你是跨平台的,那么请确保首先将任何会存储超时 ID 的变量初始化为 NULL。

    现在要解决我的问题,您必须使用 socket.io-titanium 模块,我无法使 tiws 模块工作。所以这里是使用 socket.io-titanium 解决这个问题的步骤:

    1. 进入你文件夹中的socket.io文件夹,然后打开lib文件夹,这里有 将是几个 javascript 文件。
    2. 打开 socket.js 文件。
    3. 搜索线Socket.prototype.handshake = function (fn)
    4. 在下面添加行this.heartbeatTimeoutTimer = null; 上一行。
    5. 为 Android 保存并编译。

    现在这应该可以使连接正常工作了。

    【讨论】:

      猜你喜欢
      • 2019-10-30
      • 1970-01-01
      • 2014-03-11
      • 1970-01-01
      • 2019-12-17
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      • 2020-07-08
      相关资源
      最近更新 更多