1
+ <!DOCTYPE html>
2
+ < html lang ="en ">
3
+ < head >
4
+ < meta charset ="UTF-8 ">
5
+ < title > Document</ title >
6
+ </ head >
7
+
8
+ < input type ="text " id ="text " />
9
+ < input type ="button " onclick ="sendMsg(); " value ="发送数据 " />
10
+ < input type ="button " onclick ="getState(); " value ="获取readyState状态 " />
11
+
12
+ < h1 > 服务端:node/server.js & php/server.js</ h1 >
13
+ < h2 > websocket 特性</ h2 >
14
+ < p >
15
+ 1.建立在 TCP 协议之上,服务器端的实现比较容易< br >
16
+ 2.与 HTTP 协议有着良好的兼容性。websocket 把 80 端口作为默认连接端口,握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器,而websocket的运行使用的是443端口< br >
17
+ 3.数据格式比较轻量,性能开销小,通信高效< br >
18
+ 4.可以发送文本,也可以发送二进制数据< br >
19
+ 5.没有同源限制,客户端可以与任意服务器通信< br >
20
+ 6.协议标识符是ws(如果加密,则为wss),服务器网址就是 URL< br >
21
+ </ p >
22
+
23
+ < script >
24
+
25
+ var ws = new WebSocket ( "ws://127.0.0.1:8000" ) ;
26
+
27
+ /**
28
+ * 获取websocket状态
29
+ */
30
+ function getState ( ) {
31
+ /**
32
+ * 【 readyState 】
33
+ * CONNECTING:值为0,表示正在连接
34
+ * OPEN:值为1,表示连接成功,可以通信了
35
+ * CLOSING:值为2,表示连接正在关闭
36
+ * CLOSED:值为3,表示连接已经关闭,或者打开连接失败
37
+ */
38
+ switch ( ws . readyState ) {
39
+ case WebSocket . CONNECTING :
40
+ alert ( "state:CONNECTING" ) ;
41
+ break ;
42
+ case WebSocket . OPEN :
43
+ alert ( "state:OPEN" ) ;
44
+ break ;
45
+ case WebSocket . CLOSING :
46
+ alert ( "state:CLOSING" ) ;
47
+ break ;
48
+ case WebSocket . CLOSED :
49
+ alert ( "state:CLOSED" ) ;
50
+ break ;
51
+ default :
52
+ // this never happens
53
+ break ;
54
+ }
55
+ }
56
+ /**
57
+ * 【 API 】
58
+ * 两种事件定义方式
59
+ * ws.onopen = function(event){}
60
+ * ws.addEventListener('open', function (event) {
61
+ * ws.send('Hello Server!');
62
+ * });
63
+ */
64
+ ws . onopen = function ( event ) {
65
+ console . log ( "Connection open ..." ) ;
66
+ } ;
67
+
68
+ ws . onmessage = function ( event ) {
69
+ console . log ( "Received data: " + event . data ) ;
70
+
71
+ if ( typeof event . data === String ) {
72
+ console . log ( "Received data string: " + event . data ) ;
73
+ }
74
+ if ( event . data instanceof ArrayBuffer ) {
75
+ var buffer = event . data ;
76
+ console . log ( "Received arraybuffer: " + buffer ) ;
77
+ }
78
+ /**
79
+ * 可以使用binaryType属性,显式指定收到的二进制数据类型
80
+ *
81
+ // 收到的是 blob 数据
82
+ ws.binaryType = "blob";
83
+ console.log(event.data.size);
84
+ // 收到的是 ArrayBuffer 数据
85
+ ws.binaryType = "arraybuffer";
86
+ console.log(event.data.byteLength);
87
+ */
88
+ } ;
89
+
90
+ ws . onclose = function ( event ) {
91
+ console . log ( "Connection closed ..." ) ;
92
+ console . log ( "服务器断开代码:" + event . code ) ;
93
+ console . log ( "断开理由:" + event . reason ) ;
94
+ console . log ( "wasClean:" + event . wasClean ) ;
95
+ ws . close ( ) ;
96
+ } ;
97
+
98
+ ws . onerror = function ( event ) {
99
+ console . log ( event ) ;
100
+ } ;
101
+
102
+ function sendMsg ( ) {
103
+ var content = document . getElementById ( "text" ) . value ;
104
+ /**
105
+ * 1.发送文本
106
+ */
107
+ ws . send ( content ) ;
108
+ /**
109
+ * 2.发送 Blob 对象
110
+ */
111
+ // var file = document.querySelector('input[type="file"]').files[0];
112
+ // ws.send(file);
113
+ /**
114
+ * 3.发送 ArrayBuffer 对象
115
+ * Sending canvas ImageData as ArrayBuffer
116
+ * 实例对象的bufferedAmount属性,表示还有多少字节的二进制数据没有发送出去,可以用来判断发送是否结束
117
+ */
118
+ // var img = canvas_context.getImageData(0, 0, 400, 320);
119
+ // var binary = new Uint8Array(img.data.length);
120
+ // for (var i = 0; i < img.data.length; i++) {
121
+ // binary[i] = img.data[i];
122
+ // }
123
+ // ws.send(binary.buffer);
124
+
125
+ // var data = new ArrayBuffer(10000000);
126
+ // socket.send(data);
127
+ // if (socket.bufferedAmount === 0) {
128
+ // // 发送完毕
129
+ // } else {
130
+ // // 发送还没结束
131
+ // }
132
+ }
133
+
134
+ </ script >
135
+ </ body >
136
+ </ html >
0 commit comments