`
rensanning
  • 浏览: 3518352 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:37579
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:604650
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:678516
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:87540
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:400045
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:69129
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:90644
社区版块
存档分类
最新评论

Titanium中的socket通信

阅读更多
Titanium从1.7开始强化了TCP通信方面的功能。一般大家说的通信都指的是HTTP通信,今天我们使用TCP socket,就可以跟很多的service实现通信。

在socket的同时,Titanium也支持二进制码的操作:
T.Buffer
Ti.Codec
但是稍微有些复杂,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();




上边的代码中的socket是同步的。具体socket通信的详细内容这里就不说了,相信在其他的平台上使用过socket的人都能够理解。Titanium官方也有详细的说明,这里

但是我们在通常的应用中都是采用异步的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基本所有的协议都能实现通信。

WebSocket协议的一个例子:https://github.com/masuidrive/ti-websocket-client

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

【原文】Titanium Mobileでソケット通信
  • 大小: 37.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics