Refactored WebSocketServiceHost.cs

This commit is contained in:
sta 2014-09-20 15:18:30 +09:00
parent b02cfe1819
commit 25c103d51e
3 changed files with 36 additions and 22 deletions

View File

@ -59,11 +59,21 @@ namespace WebSocketSharp.Server
#endregion #endregion
#region Internal Properties
internal ServerState State {
get {
return Sessions.State;
}
}
#endregion
#region Public Properties #region Public Properties
/// <summary> /// <summary>
/// Gets or sets a value indicating whether the WebSocket service cleans up the inactive /// Gets or sets a value indicating whether the WebSocket service cleans up
/// sessions periodically. /// the inactive sessions periodically.
/// </summary> /// </summary>
/// <value> /// <value>
/// <c>true</c> if the service cleans up the inactive sessions periodically; /// <c>true</c> if the service cleans up the inactive sessions periodically;
@ -99,11 +109,27 @@ namespace WebSocketSharp.Server
#region Internal Methods #region Internal Methods
internal void Start ()
{
Sessions.Start ();
}
internal void StartSession (WebSocketContext context) internal void StartSession (WebSocketContext context)
{ {
CreateSession ().Start (context, Sessions); CreateSession ().Start (context, Sessions);
} }
internal void Stop (ushort code, string reason)
{
var payload = new PayloadData (code.Append (reason));
var e = new CloseEventArgs (payload);
var bytes = !code.IsReserved ()
? WebSocketFrame.CreateCloseFrame (Mask.Unmask, payload).ToByteArray ()
: null;
Sessions.Stop (e, bytes);
}
#endregion #endregion
#region Protected Methods #region Protected Methods

View File

@ -276,7 +276,7 @@ namespace WebSocketSharp.Server
host.KeepClean = false; host.KeepClean = false;
if (_state == ServerState.Start) if (_state == ServerState.Start)
host.Sessions.Start (); host.Start ();
_hosts.Add (path, host); _hosts.Add (path, host);
} }
@ -309,9 +309,8 @@ namespace WebSocketSharp.Server
_hosts.Remove (path); _hosts.Remove (path);
} }
if (host.Sessions.State == ServerState.Start) if (host.State == ServerState.Start)
host.Sessions.Stop ( host.Stop ((ushort) CloseStatusCode.Away, null);
((ushort) CloseStatusCode.Away).InternalToByteArray (ByteOrder.Big), true);
return true; return true;
} }
@ -320,7 +319,7 @@ namespace WebSocketSharp.Server
{ {
lock (_sync) { lock (_sync) {
foreach (var host in _hosts.Values) foreach (var host in _hosts.Values)
host.Sessions.Start (); host.Start ();
_state = ServerState.Start; _state = ServerState.Start;
} }
@ -332,13 +331,13 @@ namespace WebSocketSharp.Server
_state = ServerState.ShuttingDown; _state = ServerState.ShuttingDown;
var payload = new PayloadData (data); var payload = new PayloadData (data);
var args = new CloseEventArgs (payload); var e = new CloseEventArgs (payload);
var bytes = send var bytes = send
? WebSocketFrame.CreateCloseFrame (Mask.Unmask, payload).ToByteArray () ? WebSocketFrame.CreateCloseFrame (Mask.Unmask, payload).ToByteArray ()
: null; : null;
foreach (var host in _hosts.Values) foreach (var host in _hosts.Values)
host.Sessions.Stop (args, bytes); host.Sessions.Stop (e, bytes);
_hosts.Clear (); _hosts.Clear ();
_state = ServerState.Stop; _state = ServerState.Stop;

View File

@ -345,25 +345,14 @@ namespace WebSocketSharp.Server
} }
} }
internal void Stop (byte[] data, bool send) internal void Stop (CloseEventArgs e, byte[] frameAsBytes)
{
var payload = new PayloadData (data);
var args = new CloseEventArgs (payload);
var bytes = send
? WebSocketFrame.CreateCloseFrame (Mask.Unmask, payload).ToByteArray ()
: null;
Stop (args, bytes);
}
internal void Stop (CloseEventArgs args, byte[] frameAsBytes)
{ {
lock (_sync) { lock (_sync) {
_state = ServerState.ShuttingDown; _state = ServerState.ShuttingDown;
_sweepTimer.Enabled = false; _sweepTimer.Enabled = false;
foreach (var session in _sessions.Values.ToList ()) foreach (var session in _sessions.Values.ToList ())
session.Context.WebSocket.Close (args, frameAsBytes, 1000); session.Context.WebSocket.Close (e, frameAsBytes, 1000);
_state = ServerState.Stop; _state = ServerState.Stop;
} }