我正在使用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吗?如果他们这样做,那么发生了什么?两者都标记为“易于实现”,但两者的文档都很糟糕,显示的行为非常混乱。
答案 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修复此问题的步骤:
Socket.prototype.handshake = function (fn)
this.heartbeatTimeoutTimer = null;
行
上一行。现在这应该使连接起作用。