Laya Byte

4078 ワード

参考Big EndianとLittle Endian Layaの公式例Byteバイナリ読み書きjsノート1 ArrayBuffer TypeArrayについて
開発プロジェクトでは、バイナリの操作は不可欠です.html 5時代には、バイナリへのサポートが大きな突破を遂げた.しかしapiの煩雑さは,開発者開発プロジェクトには不便である.ページゲーム時代にはActionscript 3.0のバイナリ配列ByteArrayは、機能が充実しており、apiの操作が簡単で分かりやすいため、LayaのByteはByteArrayを参照するとともにhtml 5の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に渡され、送信データが正しくない可能性がある.これを書くと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();
        }