Java跟AS用socket通信

发表评论 阅读评论

最近在做一个聊天室,后台用Java(其他的我也不懂),其实可以用XMLSocket来做的,也很方便,但我用了Socket,更灵活些。

为了不见乱码,并且方便些,我选择了UTF-8作为字符串编码。
Ok,说下碰到的几个问题。

AS这边不时的报Error: Error #2030: 遇到文件尾。
原因:没有足够的字节可读(就是字节太少了)。
但是我已经做了缓存,所有Java传来的数据都接收完了。
客户端:readUTF.
服务端:UTF-8.
然后把Java 传来的数据一个字节一个字节的分析,
发现 readUTF 需要现读一个16位(2个字节)的头标示字符流的长度,
而Java直接写字节流,没有写长度.
换用readUTFBytes搞定。
XMLSocket有个好处就是你不需要自己从接受的数据中分离每个包,XMLSocket用 \0 表示一个包的结束。
Socket 的好处是它很灵活,你可以传任何数据, 但是需要自己从数据中分离每个包.O(∩_∩)O~
OK, 最简单的办法:像XMLSocket一样用 \0 表示一个包的结束。

// 缓存区
var byteBuffer:ByteArray = new ByteArray();

// 有数据来了.
private function socketDataHandler(e:ProgressEvent):void 
{
    var len:uint = socket.bytesAvailable;
    while (--len >= 0)
    {
        var b:int = socket.readByte();
        // 一个包的结尾
        if (0 == b)
        {
            // 处理单个包的数据
            handleMessage(byteBuffer);
            byteBuffer = new ByteArray();
        }
        // 将数据放到缓存区里
        else
        {
            byteBuffer.writeByte(b);
        }
    }
}
标签: , ,

  1. lite3 | | #1

    @mili
    哦,服务器端没写, :roll:

  2. mili | #2

    :???: :o 要服务器的不弄

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
回到顶部