- WebSocket 是基于 TCP 的協(xié)議岖常,使Html5可以實現(xiàn)進行全雙工通訊的協(xié)議谣殊。websocket 常見于瀏覽器中王凑,但是這個協(xié)議不受使用平臺的限制。
- Laya的Laya.Socket是對Html5 WebScoket的封裝薄腻。發(fā)送的數(shù)據(jù)格式一般為字符串或者二進制。
- 通信數(shù)據(jù)格式是二進制數(shù)據(jù)届案,則需要配合Laya.Byte使用庵楷,二進制格式的優(yōu)點和使用方法可以看下Laya Byte。
- webSocket的鏈接是異步過程楣颠。所以通信消息都需要在open事件完成之后操作尽纽。
webScoket事件:Event Summary open 連接建立成功后調(diào)度。 message 接收到數(shù)據(jù)后調(diào)度童漩。 close 連接被關(guān)閉后調(diào)度弄贿。 error 出現(xiàn)異常后調(diào)度。
關(guān)于webSocket我們不做其他贅述矫膨,有興趣可以看下HTML5 WebSocket挎春。
Laya.Scoket
- Property(屬性)
Name | Summary |
---|---|
connected | 表示此 Socket 對象目前是否已連接。 |
disableInput | 不再緩存服務(wù)端發(fā)來的數(shù)據(jù)豆拨。 |
endian | 主機字節(jié)序直奋,是 CPU 存放數(shù)據(jù)的兩種不同順序,包括小端字節(jié)序和大端字節(jié)序施禾。 |
input | 緩存的服務(wù)端發(fā)來的數(shù)據(jù)脚线。 |
output | 表示需要發(fā)送至服務(wù)端的緩沖區(qū)中的數(shù)據(jù)。 |
protocols | 子協(xié)議名稱弥搞。子協(xié)議名稱字符串邮绿,或由多個子協(xié)議名稱字符串構(gòu)成的數(shù)組。 |
- Method(方法)
Name | Summary |
---|---|
Socket | 創(chuàng)建新的 Socket 對象攀例。默認字節(jié)序為 Socket.BIG_ENDIAN 船逮。 |
cleanSocket | 清理socket。 |
close | 關(guān)閉連接粤铭。 |
connect | 連接到指定的主機和端口挖胃。 |
connectByUrl | 連接到指定的服務(wù)端 WebSocket URL。 |
flush | 發(fā)送緩沖區(qū)中的數(shù)據(jù)到服務(wù)器梆惯。 |
send | 發(fā)送數(shù)據(jù)到服務(wù)器酱鸭。 |
- Constants(常量)
-
BIG_ENDIAN
主機字節(jié)序,是 CPU 存放數(shù)據(jù)的兩種不同順序垛吗,包括小端字節(jié)序和大端字節(jié)序凹髓。 BIG_ENDIAN :大端字節(jié)序,地址低位存儲值的高位怯屉,地址高位存儲值的低位蔚舀。有時也稱之為網(wǎng)絡(luò)字節(jié)序饵沧。 LITTLE_ENDIAN :小端字節(jié)序,地址低位存儲值的低位赌躺,地址高位存儲值的高位狼牺。 -
LITTLE_ENDIAN
主機字節(jié)序,是 CPU 存放數(shù)據(jù)的兩種不同順序寿谴,包括小端字節(jié)序和大端字節(jié)序锁右。 LITTLE_ENDIAN :小端字節(jié)序失受,地址低位存儲值的低位讶泰,地址高位存儲值的高位。 BIG_ENDIAN :大端字節(jié)序拂到,地址低位存儲值的高位痪署,地址高位存儲值的低位。有時也稱之為網(wǎng)絡(luò)字節(jié)序兄旬。
-
BIG_ENDIAN
Laya.Socket使用
-
服務(wù)端
-
使用pywebsocket搭建簡易web服務(wù)
可以使用網(wǎng)上的webScoket在線測試工具狼犯。比如wss://ws2s.feling.net/
-
客戶端
private webSocket: Laya.Socket;
private openBtn: Laya.Button;
private sendBtn: Laya.Button;
private closeBtn: Laya.Button;
initWebSocket() {
this.openBtn = new Laya.Button(null, '連接服務(wù)器');
this.openBtn.width = 150,
this.openBtn.height = 50
this.openBtn.labelSize = 30;
this.openBtn.labelColors = '#FFFFFF';
this.openBtn.x = 200;
this.openBtn.y = 150;
Laya.stage.addChild(this.openBtn);
this.sendBtn = new Laya.Button(null, '發(fā)送消息');
this.sendBtn.width = 150,
this.sendBtn.height = 50
this.sendBtn.labelSize = 30;
this.sendBtn.labelColors = '#FFFFFF';
this.sendBtn.x = 200;
this.sendBtn.y = 350;
Laya.stage.addChild(this.sendBtn);
this.closeBtn = new Laya.Button(null, '斷開服務(wù)器');
this.closeBtn.width = 150,
this.closeBtn.height = 50
this.closeBtn.labelSize = 30;
this.closeBtn.labelColors = '#FFFFFF';
this.closeBtn.x = 200;
this.closeBtn.y = 550;
Laya.stage.addChild(this.closeBtn);
//初始化Socket對象
this.webSocket = new Laya.Socket();
this.webSocket.on(Laya.Event.OPEN, this, this.openHandler);//連接正常打開拋出的事件
this.webSocket.on(Laya.Event.MESSAGE, this, this.receiveMsgHandler);//接收到消息拋出的事件
this.webSocket.on(Laya.Event.CLOSE, this, this.closeHandler);//socket關(guān)閉拋出的事件
this.webSocket.on(Laya.Event.ERROR, this, this.errorHandler);//連接出錯拋出的事件
//點擊按鈕鏈接服務(wù)器
this.openBtn.on(Laya.Event.CLICK, this, () => {
this.webSocket.connectByUrl("wss://ws2s.feling.net/");
})
//點擊按鈕發(fā)送消息
this.sendBtn.on(Laya.Event.CLICK, this, () => {
this.webSocket.send('{"command":"connect","host":"ip.feling.net","port":80}');
})
//點擊按鈕斷開鏈接
this.closeBtn.on(Laya.Event.CLICK, this, () => {
this.webSocket.close();
})
}
openHandler(msg) {
console.log("webSocket鏈接成功,可以發(fā)送消息.");
}
receiveMsgHandler(msg) {
console.log("收到服務(wù)器消息: " + JSON.stringify(msg));
}
closeHandler(msg) {
console.log("與服務(wù)器連接斷開.");
}
errorHandler(msg) {
console.log("與服務(wù)器通信錯誤.");
}
大致通信流程:
客戶端發(fā)起鏈接—>鏈接成功響應OPEN事件
客戶端發(fā)送消息—>服務(wù)端接受到消息處理完后進行回調(diào)—>客戶端響應MESSAGE事件
客戶端斷開鏈接—>斷開鏈接響應Close事件