Laya Byte

参考
关于Big Endian 和 Little Endian
Laya官方示例 Byte 二进制读写
js笔记一 ArrayBuffer TypeArray

在开发项目中,二进制的操作是不可或缺的。在html5时代,对二进制的支持已经有了很大的突破。但是api的繁琐,对开发者开发项目来说不太方便。在页游时代,Actionscript3.0的二进制数组ByteArray,功能完善,api操作简单易懂,因此Laya的Byte在参考ByteArray的同时承接了html5的TypedArray类型化数组的特点。

以下代码参考网络和格式--Socket

module laya {
    import Event = Laya.Event;
    import Socket = Laya.Socket;
    import Byte = Laya.Byte;

    export class NetWork_Socket {
        private socket: Socket;
        private output: Byte;

        constructor() {
            Laya.init(550, 400);

            this.connect();
        }

        private connect(): void {
            this.socket = new Socket();
            //this.socket.connect("echo.websocket.org", 80);
            this.socket.connectByUrl("ws://echo.websocket.org:80");

            this.output = this.socket.output;

            this.socket.on(Event.OPEN, this, this.onSocketOpen);
            this.socket.on(Event.CLOSE, this, this.onSocketClose);
            this.socket.on(Event.MESSAGE, this, this.onMessageReveived);
            this.socket.on(Event.ERROR, this, this.onConnectError);
        }

        private onSocketOpen(): void {
            console.log("Connected");

            // 发送字符串
            this.socket.send("demonstrate ");

            // 使用output.writeByte发送
            var message: string = "demonstrate ";
            for (var i: number = 0; i < message.length; ++i) {
                this.output.writeByte(message.charCodeAt(i));
            }
            this.socket.flush();
        }

        private onSocketClose(): void {
            console.log("Socket closed");
        }

        private onMessageReveived(message: any): void {
            console.log("Message from server:");
            if (typeof message == "string") {
                console.log(message);
            }
            else if (message instanceof ArrayBuffer) {
                console.log(new Byte(message).readUTFBytes());
            }
            this.socket.input.clear();
        }

        private onConnectError(e: Event): void {
            console.log("error");
        }
    }
}
new laya.NetWork_Socket();

以下参考Laya官方示例 WebSocket发送与接收

注意:我们看到我们实例化Byte和socket的时候都设置了endian,这个是很容易忽略的地方,有些开发者不注意这个,前端和服务端的endian不一致,导致了接收的数据是乱码,所以读写数据的时候一定要保证endian的一致。

var by:Byte = new Byte();//这里声明一个临时Byte类型
by.endian = Byte.LITTLE_ENDIAN;//设置endian;
by.writeInt32(5000);//写入一个int32数据
by.writeUint16(16);//写入一个uint16 数据
byte.writeArrayBuffer(by.buffer);//把临时字节数据的数据写入byte中,这里注意写入的是by.buffer;
byte.clear();//清除掉数据;方便下次读写;
this.socket.send(this.byte.buffer);//这里是把字节数组的数据通过socket发送给服务器。

上面我们看到,我们通过一个字节数组把我们需要的数据读入一个Byte数组,最后发送给服务器的是byte.buffer,这是一个ArrayBuffer的数据类型。这里一定要注意send的参数是ArrayBuffer,很多开发者可能不注意,直接传递成了Byte,导致发送数据不正确。假如写成this.socket.send(this.byte);这是错误的,这点一定要注意。

private function receiveHandler(msg:Object = null):void
{
    //.............这里我们假设收到的是二进制ArrayBuffer
    this.byte.clear();
    this.byte.writeArrayBuffer(msg);//把接收到的二进制数据读进byte数组便于解析。
    this.byte.pos = 0;//设置偏移指针;
      ////下面开始读取数据,按照服务器传递过来的数据,按照顺序读取
    var a:int = this.byte.getByte();
    var b:int = this.byte.getInt16();
    var c:Number = this.byte.getFloat32();
    var d:String = this.byte.getString();
    var e:String = this.byte.getUTFString();
}

判断类型可以参考socket那个例子:

        private onMessageReveived(message: any): void {
            console.log("Message from server:");
            if (typeof message == "string") {
                console.log(message);
            }
            else if (message instanceof ArrayBuffer) {
                console.log(new Byte(message).readUTFBytes());
            }
            this.socket.input.clear();
        }

你可能感兴趣的:(Laya Byte)