Can';t连接到Android中的节点js服务器

Can';t连接到Android中的节点js服务器,android,websocket,socket.io,titanium,titanium-modules,Android,Websocket,Socket.io,Titanium,Titanium Modules,我正在使用Tianium SDK 3.1.3,并尝试构建一个应用程序,其中包含一个连接到node js服务器的聊天室。 到目前为止,我已经尝试了两个不同的模块来实现这一点,但两个模块都没有成功。 我尝试的第一个模块是,我的代码如下所示: var io = require('socket.io-titanium'); var socket = io.connect('IP:PORT', {'force new connection':true}); socket.on('conne

我正在使用Tianium SDK 3.1.3,并尝试构建一个应用程序,其中包含一个连接到node js服务器的聊天室。 到目前为止,我已经尝试了两个不同的模块来实现这一点,但两个模块都没有成功。 我尝试的第一个模块是,我的代码如下所示:

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);
        }

    });
this.timeoutTimer = null;
.
. doing something else
.
this.timeoutTimer = setTimeout(...);
但我得到了一个错误:

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?中的一个文件?。 我尝试使用的另一个模块是,我使用了以下代码:

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,没有发现任何东西。
这些模块不能与Tianium SDK 3.x一起使用吗?如果他们这样做了,那么发生了什么?两者都被贴上了“易于实现”的标签,但两者的文档都很糟糕,显示的行为也很混乱。

好的,这一个有点棘手,但在查看了几张票据后,我发现Android上存在超时问题。如果未定义分配给超时的变量,则该变量将不起作用。我的意思是,如果你有这样的东西

this.timeoutTimer = setTimeout(...); //imagine the variable this is a reference to an object that is storing properties for a connection.
它将不起作用,但如果在为timeoutTimer属性指定超时id之前为其指定空值,如下所示:

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);
        }

    });
this.timeoutTimer = null;
.
. doing something else
.
this.timeoutTimer = setTimeout(...);
它将毫无问题地工作

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

现在要解决我的问题,您必须使用socket.io-tianium模块,我无法使tiws模块工作。下面是使用socket.io-titanium解决此问题的步骤:

  • 转到文件夹中的socket.io文件夹,然后在此处打开lib文件夹 将有几个javascript文件
  • 打开socket.js文件
  • 搜索行
    Socket.prototype.handshake=function(fn)
  • 添加行
    this.heartbeatTimeoutTimer=null就在
    前一行
  • 为Android保存和编译
  • 现在,这将使连接正常工作