forked from sta/websocket-sharp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProgram.cs
167 lines (139 loc) · 5.77 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
using System;
using System.Configuration;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using WebSocketSharp;
using WebSocketSharp.Net;
using WebSocketSharp.Server;
namespace Example3
{
public class Program
{
public static void Main (string[] args)
{
// Create a new instance of the HttpServer class.
//
// If you would like to provide the secure connection, you should
// create a new instance with the 'secure' parameter set to true,
// or an https scheme HTTP URL.
var httpsv = new HttpServer (4649);
//var httpsv = new HttpServer (5963, true);
//var httpsv = new HttpServer (System.Net.IPAddress.Any, 4649);
//var httpsv = new HttpServer (System.Net.IPAddress.Any, 5963, true);
//var httpsv = new HttpServer (System.Net.IPAddress.IPv6Any, 4649);
//var httpsv = new HttpServer (System.Net.IPAddress.IPv6Any, 5963, true);
//var httpsv = new HttpServer ("http://0.0.0.0:4649");
//var httpsv = new HttpServer ("https://0.0.0.0:5963");
//var httpsv = new HttpServer ("http://[::0]:4649");
//var httpsv = new HttpServer ("https://[::0]:5963");
//var httpsv = new HttpServer (System.Net.IPAddress.Loopback, 4649);
//var httpsv = new HttpServer (System.Net.IPAddress.Loopback, 5963, true);
//var httpsv = new HttpServer (System.Net.IPAddress.IPv6Loopback, 4649);
//var httpsv = new HttpServer (System.Net.IPAddress.IPv6Loopback, 5963, true);
//var httpsv = new HttpServer ("http://localhost:4649");
//var httpsv = new HttpServer ("https://localhost:5963");
//var httpsv = new HttpServer ("http://127.0.0.1:4649");
//var httpsv = new HttpServer ("https://127.0.0.1:5963");
//var httpsv = new HttpServer ("http://[::1]:4649");
//var httpsv = new HttpServer ("https://[::1]:5963");
#if DEBUG
// To change the logging level.
httpsv.Log.Level = LogLevel.Trace;
// To change the wait time for the response to the WebSocket Ping or Close.
//httpsv.WaitTime = TimeSpan.FromSeconds (2);
// Not to remove the inactive WebSocket sessions periodically.
//httpsv.KeepClean = false;
#endif
// To provide the secure connection.
/*
var cert = ConfigurationManager.AppSettings["ServerCertFile"];
var passwd = ConfigurationManager.AppSettings["CertFilePassword"];
httpsv.SslConfiguration.ServerCertificate = new X509Certificate2 (cert, passwd);
*/
// To provide the HTTP Authentication (Basic/Digest).
/*
httpsv.AuthenticationSchemes = AuthenticationSchemes.Basic;
httpsv.Realm = "WebSocket Test";
httpsv.UserCredentialsFinder = id => {
var name = id.Name;
// Return user name, password, and roles.
return name == "nobita"
? new NetworkCredential (name, "password", "gunfighter")
: null; // If the user credentials aren't found.
};
*/
// To resolve to wait for socket in TIME_WAIT state.
//httpsv.ReuseAddress = true;
// Set the document root path.
httpsv.DocumentRootPath = ConfigurationManager.AppSettings["DocumentRootPath"];
// Set the HTTP GET request event.
httpsv.OnGet += (sender, e) => {
var req = e.Request;
var res = e.Response;
var path = req.RawUrl;
if (path == "/")
path += "index.html";
byte[] contents;
if (!e.TryReadFile (path, out contents)) {
res.StatusCode = (int) HttpStatusCode.NotFound;
return;
}
if (path.EndsWith (".html")) {
res.ContentType = "text/html";
res.ContentEncoding = Encoding.UTF8;
}
else if (path.EndsWith (".js")) {
res.ContentType = "application/javascript";
res.ContentEncoding = Encoding.UTF8;
}
res.ContentLength64 = contents.LongLength;
res.Close (contents, true);
};
// Add the WebSocket services.
httpsv.AddWebSocketService<Echo> ("/Echo");
httpsv.AddWebSocketService<Chat> ("/Chat");
// Add the WebSocket service with initializing.
/*
httpsv.AddWebSocketService<Chat> (
"/Chat",
() =>
new Chat ("Anon#") {
// To send the Sec-WebSocket-Protocol header that has a subprotocol name.
Protocol = "chat",
// To ignore the Sec-WebSocket-Extensions header.
IgnoreExtensions = true,
// To emit a WebSocket.OnMessage event when receives a ping.
EmitOnPing = true,
// To validate the Origin header.
OriginValidator = val => {
// Check the value of the Origin header, and return true if valid.
Uri origin;
return !val.IsNullOrEmpty ()
&& Uri.TryCreate (val, UriKind.Absolute, out origin)
&& origin.Host == "localhost";
},
// To validate the cookies.
CookiesValidator = (req, res) => {
// Check the cookies in 'req', and set the cookies to send to
// the client with 'res' if necessary.
foreach (Cookie cookie in req) {
cookie.Expired = true;
res.Add (cookie);
}
return true; // If valid.
}
}
);
*/
httpsv.Start ();
if (httpsv.IsListening) {
Console.WriteLine ("Listening on port {0}, and providing WebSocket services:", httpsv.Port);
foreach (var path in httpsv.WebSocketServices.Paths)
Console.WriteLine ("- {0}", path);
}
Console.WriteLine ("\nPress Enter key to stop the server...");
Console.ReadLine ();
httpsv.Stop ();
}
}
}