Titanium中的socket通信

本文介绍了Titanium 1.7版本开始支持的TCP通信功能,包括如何使用Titanium Buffer和Codec进行二进制数据操作,并提供了同步和异步socket通信的示例代码。此外还提到了WebSocket协议的应用。
Titanium从1.7开始强化了TCP通信方面的功能。一般大家说的通信都指的是HTTP通信,今天我们使用TCP socket,就可以跟很多的service实现通信。

在socket的同时,Titanium也支持二进制码的操作:
[url=http://developer.appcelerator.com/apidoc/mobile/latest/Titanium.Buffer-object]T.Buffer[/url]
[url=http://developer.appcelerator.com/apidoc/mobile/latest/Titanium.Codec-module]Ti.Codec[/url]
但是稍微有些复杂,HTTP以外的协议也能够使用。

那么我们就尽早的看看socket通信的例子吧。

var win = Ti.UI.createWindow({ title: "Win1" });
var textarea = Ti.UI.createTextArea({value: ''});
win.add(textarea);
win.open();

// 读数据用Buffer
var readBuffer = Ti.createBuffer({length:1024});

// socket部分
var socket;
socket = Ti.Network.Socket.createTCP({
host: "blog.masuidrive.jp",
port: 80,
connected: function(e) { // 连接到socket
textarea.value += ">> Connected to host " + socket.host + "\n";
// 组成要写入的二进制数据
var data = Ti.createBuffer({value:"GET /tmp/test.html HTTP/1.1\r\n"+
"Host: blog.masuidrive.jp\r\n\r\n"});
// 写入到socket
var bytesWritten = socket.write(data);

var bytesRead;
// 循环读取直到结束
while( (bytesRead = socket.read(readBuffer)) >= 0 ) {
// 将读取的二进制转化为字符串
var stringData = Ti.Codec.decodeString({
source: readBuffer, length: bytesRead });
textarea.value += bytesRead + "> " + stringData + "\n";
// 清空读取用Buffer
readBuffer.clear();
}
// 关闭socket
socket.close();
},
closed: function(e) { // socket关闭之后
textarea.value += ">> Socket closed";
}
});
socket.connect();


[img]http://dl.iteye.com/upload/attachment/611049/391454ca-b380-3bb3-ac8b-c7ca5f93ee48.jpg[/img]

上边的代码中的socket是同步的。具体socket通信的详细内容这里就不说了,相信在其他的平台上使用过socket的人都能够理解。Titanium官方也有详细的说明,[url=http://developer.appcelerator.com/blog/2011/05/titanium-mobile-intro-series-sockets.html]这里[/url]

但是我们在通常的应用中都是采用异步的socket通信。可惜这部分在官方文档中也没有。

异步的socket处理大概是下边这样的:

var win = Ti.UI.createWindow({ title: "Win1" });
var textarea = Ti.UI.createTextArea({value: ''});
win.add(textarea);
win.open();

var socket;
var readBuffer = Ti.createBuffer({length:1024});

// 数据被读入时调用
var readCallback = function(e) {
// 数据完成后关闭socket
if (e.bytesProcessed == -1) { // EOF
textarea.value += ">> Received socket closed\n";
socket.close();
return;
}

// 显示读入的数据
var str = Ti.Codec.decodeString({source:readBuffer, length:e.bytesProcessed});
textarea.value += e.bytesProcessed + "> " + str + "\n";

// 下回读入数据时设定Buffer和回调
Ti.Stream.read(socket, readBuffer, readCallback);
};

socket = Ti.Network.Socket.createTCP({
host: "blog.masuidrive.jp",
port: 80,
connected: function(e) {
// 读入数据时Buffer和回调
Ti.Stream.read(socket, readBuffer, readCallback);

textarea.value += ">> Connected to host " + socket.host + "\n";

// 写入处理
var data = Ti.createBuffer({value:"GET /tmp/test.html HTTP/1.1\r\nHost: blog.masuidrive.jp\r\n\r\n"});
var bytesWritten = socket.write(data);
},
closed: function(e) {
textarea.value += ">> Socket closed";
}
});
socket.connect();


这次在读入数据时,调用了readCallback。使用这样的方法,利用TCP基本所有的协议都能实现通信。

[url=http://ja.wikipedia.org/wiki/WebSocket]WebSocket[/url]协议的一个例子:https://github.com/masuidrive/ti-websocket-client

实时聊天,或者不想上时间保持会话时候,不使用HTTP,而使用WebSocket实现是不错的选择。

【原文】[url=http://blog.masuidrive.jp/index.php/2011/12/04/socket-with-titanium/]Titanium Mobileでソケット通信[/url]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值