1
- /*
2
- Prerequisites:
3
-
4
- 1. Install node.js and npm
5
- 2. npm install ws
6
-
7
- See also,
8
-
9
- http://einaros.github.com/ws/
10
-
11
- To run,
12
-
13
- node example-server.js
14
- */
1
+ // To run,
2
+ //
3
+ // npm install # to install the 'ws' dependency
4
+ // node testServer.js
15
5
16
6
"use strict" ; // http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/
17
7
var WebSocketServer = require ( 'ws' ) . Server ;
18
8
var http = require ( 'http' ) ;
9
+ var url = require ( 'url' ) ;
19
10
var app = http . createServer ( ) ;
20
- var server ; // assigned by app.listen() below
11
+ var server ;
21
12
22
- var wssEchoWithSize = new WebSocketServer ( { server : app , path : '/echoWithSize' } ) ;
13
+ var wssEchoWithSize = new WebSocketServer ( { noServer : true } ) ;
23
14
wssEchoWithSize . on ( 'connection' , function ( ws ) {
24
- ws . on ( 'message' , function ( data , flags ) {
25
- if ( flags . binary ) { return ; }
15
+ ws . on ( 'message' , function ( data ) {
16
+ if ( data instanceof Buffer ) { return ; }
26
17
ws . send ( data . length + '\n' + data ) ;
27
18
} ) ;
28
19
ws . on ( 'close' , function ( ) {
@@ -31,12 +22,10 @@ wssEchoWithSize.on('connection', function(ws) {
31
22
} ) ;
32
23
} ) ;
33
24
34
- var wssBinaryEchoWithSize = new WebSocketServer ( { server : app , path : '/binaryEchoWithSize' } ) ;
25
+ var wssBinaryEchoWithSize = new WebSocketServer ( { noServer : true } ) ;
35
26
wssBinaryEchoWithSize . on ( 'connection' , function ( ws ) {
36
- ws . on ( 'message' , function ( data , flags ) {
37
- if ( ! flags . binary ) { return ; }
38
- //var result = new ArrayBuffer(data.length + 4);
39
- //new DataView(result).setInt32(0, data.length, false); // false = big endian
27
+ ws . on ( 'message' , function ( data ) {
28
+ if ( ! data instanceof Buffer ) { return ; }
40
29
var result = new Buffer ( data . length + 4 ) ;
41
30
result . writeInt32BE ( data . length , 0 ) ;
42
31
data . copy ( result , 4 , 0 , data . length ) ;
@@ -48,10 +37,10 @@ wssBinaryEchoWithSize.on('connection', function(ws) {
48
37
} ) ;
49
38
} ) ;
50
39
51
- var wssKillServer = new WebSocketServer ( { server : app , path : '/killServer' } ) ;
40
+ var wssKillServer = new WebSocketServer ( { noServer : true } ) ;
52
41
wssKillServer . on ( 'connection' , function ( ws ) {
53
- ws . on ( 'message' , function ( data , flags ) {
54
- if ( flags . binary ) { return ; }
42
+ ws . on ( 'message' , function ( data ) {
43
+ if ( data instanceof Buffer ) { return ; }
55
44
server . close ( ) ;
56
45
} ) ;
57
46
ws . on ( 'close' , function ( ) {
@@ -60,6 +49,32 @@ wssKillServer.on('connection', function(ws) {
60
49
} ) ;
61
50
} ) ;
62
51
52
+ app . on ( 'upgrade' , function ( request , socket , head ) {
53
+ var pathname = url . parse ( request . url ) . pathname ;
54
+
55
+ if ( '/echoWithSize' === pathname ) {
56
+ wssEchoWithSize . handleUpgrade ( request , socket , head , function ( ws ) {
57
+ wssEchoWithSize . emit ( 'connection' , ws , request ) ;
58
+ } ) ;
59
+ }
60
+
61
+ else if ( '/binaryEchoWithSize' === pathname ) {
62
+ wssBinaryEchoWithSize . handleUpgrade ( request , socket , head , function ( ws ) {
63
+ wssBinaryEchoWithSize . emit ( 'connection' , ws , request ) ;
64
+ } ) ;
65
+ }
66
+
67
+ else if ( '/killServer' === pathname ) {
68
+ wssKillServer . handleUpgrade ( request , socket , head , function ( ws ) {
69
+ wssKillServer . emit ( 'connection' , ws , request ) ;
70
+ } ) ;
71
+ }
72
+
73
+ else {
74
+ socket . destroy ( ) ;
75
+ }
76
+ } ) ;
77
+
63
78
var PORT = parseInt ( process . env . PORT || '8123' ) ;
64
79
server = app . listen ( PORT ) ;
65
80
console . log ( 'Listening on port ' + PORT + '...' ) ;
0 commit comments