参考
关于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 <sendString>");
// 使用output.writeByte发送
var message: string = "demonstrate <output.writeByte>";
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();
注意:我们看到我们实例化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();
}