我正在使用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的tiws模块,为此我使用了以下代码:
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的超时问题。如果未定义要分配给超时的变量,则它将无效。我的意思是,如果您有类似的事情;
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解决此问题的步骤:
Socket.prototype.handshake = function (fn)
this.heartbeatTimeoutTimer = null;
正下方。现在,这应该使连接正常工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句