Modified broadcasting
This commit is contained in:
@@ -28,8 +28,10 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using WebSocketSharp.Net;
|
||||
|
||||
namespace WebSocketSharp.Server
|
||||
@@ -195,6 +197,59 @@ namespace WebSocketSharp.Server
|
||||
|
||||
#region Private Methods
|
||||
|
||||
private void broadcast (Opcode opcode, byte [] data)
|
||||
{
|
||||
WaitCallback callback = state =>
|
||||
{
|
||||
var cache = new Dictionary<CompressionMethod, byte []> ();
|
||||
try {
|
||||
foreach (var host in ServiceHosts)
|
||||
{
|
||||
if (_state != ServerState.START)
|
||||
break;
|
||||
|
||||
host.Sessions.BroadcastInternally (opcode, data, cache);
|
||||
}
|
||||
}
|
||||
catch (Exception ex) {
|
||||
_logger.Fatal (ex.ToString ());
|
||||
}
|
||||
finally {
|
||||
cache.Clear ();
|
||||
}
|
||||
};
|
||||
|
||||
ThreadPool.QueueUserWorkItem (callback);
|
||||
}
|
||||
|
||||
private void broadcast (Opcode opcode, Stream stream)
|
||||
{
|
||||
WaitCallback callback = state =>
|
||||
{
|
||||
var cache = new Dictionary<CompressionMethod, Stream> ();
|
||||
try {
|
||||
foreach (var host in ServiceHosts)
|
||||
{
|
||||
if (_state != ServerState.START)
|
||||
break;
|
||||
|
||||
host.Sessions.BroadcastInternally (opcode, stream, cache);
|
||||
}
|
||||
}
|
||||
catch (Exception ex) {
|
||||
_logger.Fatal (ex.ToString ());
|
||||
}
|
||||
finally {
|
||||
foreach (var cached in cache.Values)
|
||||
cached.Dispose ();
|
||||
|
||||
cache.Clear ();
|
||||
}
|
||||
};
|
||||
|
||||
ThreadPool.QueueUserWorkItem (callback);
|
||||
}
|
||||
|
||||
private Dictionary<string, Dictionary<string, bool>> broadping (byte [] frameAsBytes, int timeOut)
|
||||
{
|
||||
var result = new Dictionary<string, Dictionary<string, bool>> ();
|
||||
@@ -316,13 +371,10 @@ namespace WebSocketSharp.Server
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var host in ServiceHosts)
|
||||
{
|
||||
if (_state != ServerState.START)
|
||||
break;
|
||||
|
||||
host.Sessions.BroadcastInternally (data);
|
||||
}
|
||||
if (data.LongLength <= WebSocket.FragmentLength)
|
||||
broadcast (Opcode.BINARY, data);
|
||||
else
|
||||
broadcast (Opcode.BINARY, new MemoryStream (data));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -341,13 +393,11 @@ namespace WebSocketSharp.Server
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var host in ServiceHosts)
|
||||
{
|
||||
if (_state != ServerState.START)
|
||||
break;
|
||||
|
||||
host.Sessions.BroadcastInternally (data);
|
||||
}
|
||||
var rawData = Encoding.UTF8.GetBytes (data);
|
||||
if (rawData.LongLength <= WebSocket.FragmentLength)
|
||||
broadcast (Opcode.TEXT, rawData);
|
||||
else
|
||||
broadcast (Opcode.TEXT, new MemoryStream (rawData));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -362,7 +412,7 @@ namespace WebSocketSharp.Server
|
||||
/// </param>
|
||||
public void BroadcastTo (byte [] data, string servicePath)
|
||||
{
|
||||
var msg = _state.CheckIfStarted () ?? data.CheckIfValidSendData () ?? servicePath.CheckIfValidServicePath ();
|
||||
var msg = _state.CheckIfStarted () ?? servicePath.CheckIfValidServicePath ();
|
||||
if (msg != null)
|
||||
{
|
||||
_logger.Error (msg);
|
||||
@@ -376,7 +426,7 @@ namespace WebSocketSharp.Server
|
||||
return;
|
||||
}
|
||||
|
||||
host.Sessions.BroadcastInternally (data);
|
||||
host.Sessions.Broadcast (data);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -391,7 +441,7 @@ namespace WebSocketSharp.Server
|
||||
/// </param>
|
||||
public void BroadcastTo (string data, string servicePath)
|
||||
{
|
||||
var msg = _state.CheckIfStarted () ?? data.CheckIfValidSendData () ?? servicePath.CheckIfValidServicePath ();
|
||||
var msg = _state.CheckIfStarted () ?? servicePath.CheckIfValidServicePath ();
|
||||
if (msg != null)
|
||||
{
|
||||
_logger.Error (msg);
|
||||
@@ -405,7 +455,7 @@ namespace WebSocketSharp.Server
|
||||
return;
|
||||
}
|
||||
|
||||
host.Sessions.BroadcastInternally (data);
|
||||
host.Sessions.Broadcast (data);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@@ -28,8 +28,10 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Timers;
|
||||
|
||||
namespace WebSocketSharp.Server
|
||||
@@ -47,7 +49,7 @@ namespace WebSocketSharp.Server
|
||||
private Dictionary<string, WebSocketService> _sessions;
|
||||
private volatile ServerState _state;
|
||||
private volatile bool _sweeping;
|
||||
private Timer _sweepTimer;
|
||||
private System.Timers.Timer _sweepTimer;
|
||||
private object _sync;
|
||||
|
||||
#endregion
|
||||
@@ -229,7 +231,7 @@ namespace WebSocketSharp.Server
|
||||
|
||||
private void setSweepTimer (double interval)
|
||||
{
|
||||
_sweepTimer = new Timer (interval);
|
||||
_sweepTimer = new System.Timers.Timer (interval);
|
||||
_sweepTimer.Elapsed += (sender, e) =>
|
||||
{
|
||||
Sweep ();
|
||||
@@ -254,32 +256,69 @@ namespace WebSocketSharp.Server
|
||||
}
|
||||
}
|
||||
|
||||
internal void BroadcastInternally (byte [] data)
|
||||
internal void BroadcastInternally (Opcode opcode, byte [] data)
|
||||
{
|
||||
var services = ServiceInstances.GetEnumerator ();
|
||||
Action completed = null;
|
||||
completed = () =>
|
||||
WaitCallback callback = state =>
|
||||
{
|
||||
if (_state == ServerState.START && services.MoveNext ())
|
||||
services.Current.SendAsync (data, completed);
|
||||
var cache = new Dictionary<CompressionMethod, byte []> ();
|
||||
try {
|
||||
BroadcastInternally (opcode, data, cache);
|
||||
}
|
||||
catch (Exception ex) {
|
||||
_logger.Fatal (ex.ToString ());
|
||||
}
|
||||
finally {
|
||||
cache.Clear ();
|
||||
}
|
||||
};
|
||||
|
||||
if (_state == ServerState.START && services.MoveNext ())
|
||||
services.Current.SendAsync (data, completed);
|
||||
ThreadPool.QueueUserWorkItem (callback);
|
||||
}
|
||||
|
||||
internal void BroadcastInternally (string data)
|
||||
internal void BroadcastInternally (Opcode opcode, Stream stream)
|
||||
{
|
||||
var services = ServiceInstances.GetEnumerator ();
|
||||
Action completed = null;
|
||||
completed = () =>
|
||||
WaitCallback callback = state =>
|
||||
{
|
||||
if (_state == ServerState.START && services.MoveNext ())
|
||||
services.Current.SendAsync (data, completed);
|
||||
var cache = new Dictionary <CompressionMethod, Stream> ();
|
||||
try {
|
||||
BroadcastInternally (opcode, stream, cache);
|
||||
}
|
||||
catch (Exception ex) {
|
||||
_logger.Fatal (ex.ToString ());
|
||||
}
|
||||
finally {
|
||||
foreach (var cached in cache.Values)
|
||||
cached.Dispose ();
|
||||
|
||||
cache.Clear ();
|
||||
}
|
||||
};
|
||||
|
||||
if (_state == ServerState.START && services.MoveNext ())
|
||||
services.Current.SendAsync (data, completed);
|
||||
ThreadPool.QueueUserWorkItem (callback);
|
||||
}
|
||||
|
||||
internal void BroadcastInternally (
|
||||
Opcode opcode, byte [] data, Dictionary<CompressionMethod, byte []> cache)
|
||||
{
|
||||
foreach (var session in ServiceInstances)
|
||||
{
|
||||
if (_state != ServerState.START)
|
||||
break;
|
||||
|
||||
session.Context.WebSocket.Send (opcode, data, cache);
|
||||
}
|
||||
}
|
||||
|
||||
internal void BroadcastInternally (
|
||||
Opcode opcode, Stream stream, Dictionary <CompressionMethod, Stream> cache)
|
||||
{
|
||||
foreach (var session in ServiceInstances)
|
||||
{
|
||||
if (_state != ServerState.START)
|
||||
break;
|
||||
|
||||
session.Context.WebSocket.Send (opcode, stream, cache);
|
||||
}
|
||||
}
|
||||
|
||||
internal Dictionary<string, bool> BroadpingInternally ()
|
||||
@@ -367,7 +406,10 @@ namespace WebSocketSharp.Server
|
||||
return;
|
||||
}
|
||||
|
||||
BroadcastInternally (data);
|
||||
if (data.LongLength <= WebSocket.FragmentLength)
|
||||
BroadcastInternally (Opcode.BINARY, data);
|
||||
else
|
||||
BroadcastInternally (Opcode.BINARY, new MemoryStream (data));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -385,7 +427,11 @@ namespace WebSocketSharp.Server
|
||||
return;
|
||||
}
|
||||
|
||||
BroadcastInternally (data);
|
||||
var rawData = Encoding.UTF8.GetBytes (data);
|
||||
if (rawData.LongLength <= WebSocket.FragmentLength)
|
||||
BroadcastInternally (Opcode.TEXT, rawData);
|
||||
else
|
||||
BroadcastInternally (Opcode.TEXT, new MemoryStream (rawData));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
Reference in New Issue
Block a user