无法连接到Android中的节点js服务器

时间:2013-12-31 19:21:46

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

我正在使用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吗?如果他们这样做,那么发生了什么?两者都标记为“易于实现”,但两者的文档都很糟糕,显示的行为非常混乱。

1 个答案:

答案 0 :(得分:3)

好的,这个有点棘手,但经过多张门票后我才知道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(...);

它没有任何问题。

请注意这一点,这只是一个安卓问题,iOS不提出这个问题,但如果您进行交叉平台,那么确定任何可能存储超时ID的变量首先被初始化为空。

现在要解决我的问题,你必须使用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保存并编译。
  6. 现在这应该使连接起作用。