首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >最大as3 adobe字符串长度

最大as3 adobe字符串长度
EN

Stack Overflow用户
提问于 2013-08-13 14:07:19
回答 2查看 1.3K关注 0票数 5

我用Java编写了Socket通信服务器,用AS3编写了AIR程序,使用套接字连接。通过套接字连接的通信是通过JSON序列化完成的。

有时,在套接字上使用非常长的JSON字符串时,AS3代码会说存在一个JSON解析错误。

每个JSON我以 end 字符串结尾,让编程人员知道它不是消息的结尾,所以这不是AIR程序读取消息的部分问题。

错误只发生在实际长的json字符串中,例如,长度为78031的字符串。JSON序列化有什么限制吗?

EN

回答 2

Stack Overflow用户

发布于 2013-10-29 12:33:48

我也有同样的问题。问题在于Flash应用程序从套接字读取数据。

关键是,即使服务器没有发送所有的数据,并且留下了一些东西(特别是当数据很大,连接很慢时),Flash事件也会触发。因此,像{"key":"value"}这样的东西有两个(或更多)部分,比如:{"key":"value"}。另外,有时您可能会在一条消息中收到几个连接的JSON,比如{"json1key":"value"}{"json2key":"value"}内置的Flash解析器也无法处理这些。

为了避免这种情况,我建议您修改Flash中的SocketData处理程序,为接收到的字符串添加一个缓存。如下所示:

代码语言:javascript
运行
复制
// declaring vars
private var _socket:Socket;
private var _cache: String = "";

// adding EventListener
_socket.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData);

private function onSocketData(e: Event):void
{
    // take the incoming data from socket
    var fromServer: ByteArray = new ByteArray;
    while (_socket.bytesAvailable)
    {
        _socket.readBytes(fromServer);
    }

    var receivedToString: String = fromServer.toString();
    _cache += receivedToString;

    if (receivedToString.length == 0) return;   // nothing to parse

    // convert that long string to the Vector of JSONs
    // here is very small and not fail-safe alghoritm of detecting separate JSONs in one long String
    var jsonPart: String = "";
    var jsonVector: Vector.<String> = new Vector.<String>;
    var bracketsCount: int = 0;
    var endOfLastJson: int = 0;

    for (var i: int = 0; i < _cache.length; i++)
    {
        if (_cache.charAt(i) == "{") bracketsCount += 1;
        if (bracketsCount > 0) jsonPart = jsonPart.concat(_cache.charAt(i));
        if (_cache.charAt(i) == "}")
        {
            bracketsCount -= 1;
            if (bracketsCount == 0)
            {
                jsonVector.push(jsonPart);
                jsonPart = "";
                endOfLastJson = i;
            }
        }
    }

    // removing part that isn't needed anymore 
    if (jsonVector.length > 0)
    {
        _cache = _cache.substr(endOfLastJson + 1);
    }

    for each (var part: String in jsonVector)
    {
        trace("RECEIVED: " + part); // voila! here is the full received JSON
    }
}
票数 1
EN

Stack Overflow用户

发布于 2013-08-14 02:56:51

根据Adobe,您似乎面临的不是JSON问题,而是套接字限制。

您可以通过writeUTF和readUTF通过套接字发送的字符串限制为65,535字节。这是因为字符串以16位无符号整数而不是以null结尾的字符串为前缀。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18211368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档