Titanium TCP / IP套接字读取缓冲数据

时间:2016-03-18 14:30:10

标签: tcp titanium buffer

我正在从服务器上读取tcp-ip套接字响应(JSON)。问题是,有时如果从服务器接收的数据非常大,则它会以2或3批次随机中断JSON。有没有办法检测从服务器发送了多少批次,或者是否有机制在客户端解决这个问题?下面是TCP / IP的钛代码:

var socket = Ti.Network.Socket.createTCP({
host: '127.0.0.1', 
port: 5000,
connected: function (e) {
    Ti.API.info('Socket opened!');
    Ti.Stream.pump(socket, readCallback, 2048, true);
},
    error: function (e) {
    Ti.API.info('Error (' + e.errorCode + '): ' + JSON.stringify(e));
},
});

socket.connect();

function writeCallback(e) {
    Ti.API.info('Successfully wrote to socket.'+JSON.stringify(e));
}

function readCallback(e) {
Ti.API.info('e ' + JSON.stringify(e));
if (e.bytesProcessed == -1)
{
    // Error / EOF on socket. Do any cleanup here.
    Ti.API.info('DONE');
}
try {
    if(e.buffer) {
        var received = e.buffer.toString();
        Ti.API.info('Received: ' + received);

    } else {
        Ti.API.error('Error: read callback called with no buffer!');
        socket.close();
    }
} catch (ex) {
    Ti.API.error('Catch ' + ex);
}
}

2 个答案:

答案 0 :(得分:0)

TCP / IP是一个流媒体接口,无法保证客户端从套接字尝试读取时将接收多少数据。

您必须在服务器和客户端之间实现某种协议。

答案 1 :(得分:0)

TCP/IP 协议不是那样设计的,你不知道你会收到多少数据,它在黑暗中哈哈

据我所知,有两种方法可以解决这个问题。

第一个是EOF,你会在数据包的末尾添加一些作为前缀的东西,它是一个独特的字符串,如[%~Done~%]

所以?您将收到所有内容并在其中搜索有关此字符串的内容,您找到了吗?我们去加工吧。

但我认为这是浪费时间、内存,而且非常原始

第二个是 Prefix Packet header,它对我来说是最好的,.NET 中的一个例子可以在这里找到:Thanks to Stephen Cleary