mirror of
https://github.com/AlexMacocian/MTSC.git
synced 2026-07-15 14:59:33 +00:00
Switched to a concurrent collection for message queue.
This commit is contained in:
@@ -15,7 +15,7 @@ namespace MTSC_TestServer
|
||||
static void Main(string[] args)
|
||||
{
|
||||
X509Certificate2 certificate = new X509Certificate2("localhost.pfx", "psdsd");
|
||||
Server server = new Server(555);
|
||||
Server server = new Server(80);
|
||||
server.TickRate = 60;
|
||||
server.ScaleUsage = true;
|
||||
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024);
|
||||
|
||||
@@ -186,7 +186,7 @@ namespace MTSC.Common.Http
|
||||
/// <param name="value">Header value.</param>
|
||||
public void AddGeneralHeader(GeneralHeadersEnum header, string value)
|
||||
{
|
||||
headers.Add(generalHeaders[(int)header], value);
|
||||
headers[generalHeaders[(int)header]] = value;
|
||||
}
|
||||
/// <summary>
|
||||
/// Add a request header to the message.
|
||||
@@ -195,7 +195,7 @@ namespace MTSC.Common.Http
|
||||
/// <param name="value">Header value.</param>
|
||||
public void AddRequestHeader(RequestHeadersEnum requestHeader, string value)
|
||||
{
|
||||
headers.Add(requestHeaders[(int)requestHeader], value);
|
||||
headers[requestHeaders[(int)requestHeader]] = value;
|
||||
}
|
||||
/// <summary>
|
||||
/// Add a response header to the message.
|
||||
@@ -204,7 +204,7 @@ namespace MTSC.Common.Http
|
||||
/// <param name="value">Header value.</param>
|
||||
public void AddResponseHeader(ResponseHeadersEnum responseHeader, string value)
|
||||
{
|
||||
headers.Add(responseHeaders[(int)responseHeader], value);
|
||||
headers[responseHeaders[(int)responseHeader]] = value;
|
||||
}
|
||||
/// <summary>
|
||||
/// Add an entity header to the message.
|
||||
@@ -213,7 +213,7 @@ namespace MTSC.Common.Http
|
||||
/// <param name="value">Header value.</param>
|
||||
public void AddEntityHeaders(EntityHeadersEnum entityHeader, string value)
|
||||
{
|
||||
headers.Add(entityHeaders[(int)entityHeader], value);
|
||||
headers[entityHeaders[(int)entityHeader]] = value;
|
||||
}
|
||||
/// <summary>
|
||||
/// Build the request bytes based on the message contents.
|
||||
|
||||
@@ -2,8 +2,10 @@
|
||||
using MTSC.Common.Http;
|
||||
using MTSC.Common.Http.ServerModules;
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
|
||||
namespace MTSC.Server.Handlers
|
||||
{
|
||||
@@ -14,7 +16,8 @@ namespace MTSC.Server.Handlers
|
||||
{
|
||||
#region Fields
|
||||
List<IHttpModule> httpModules = new List<IHttpModule>();
|
||||
Queue<Tuple<ClientData,HttpMessage>> messageQueue = new Queue<Tuple<ClientData, HttpMessage>>();
|
||||
ConcurrentQueue<Tuple<ClientData,HttpMessage>> messageQueue = new ConcurrentQueue<Tuple<ClientData, HttpMessage>>();
|
||||
object queueLock = new object();
|
||||
#endregion
|
||||
#region Constructors
|
||||
public HttpHandler()
|
||||
@@ -37,7 +40,7 @@ namespace MTSC.Server.Handlers
|
||||
/// Send a response back to the client.
|
||||
/// </summary>
|
||||
/// <param name="response">Message containing the response.</param>
|
||||
public void SendResponse(ClientData client, HttpMessage response)
|
||||
public void QueueResponse(ClientData client, HttpMessage response)
|
||||
{
|
||||
messageQueue.Enqueue(new Tuple<ClientData, HttpMessage>(client, response));
|
||||
}
|
||||
@@ -88,7 +91,7 @@ namespace MTSC.Server.Handlers
|
||||
break;
|
||||
}
|
||||
}
|
||||
SendResponse(client, responseMessage);
|
||||
QueueResponse(client, responseMessage);
|
||||
return false;
|
||||
}
|
||||
/// <summary>
|
||||
@@ -116,10 +119,13 @@ namespace MTSC.Server.Handlers
|
||||
/// </summary>
|
||||
void IHandler.Tick(Server server)
|
||||
{
|
||||
while(messageQueue.Count > 0)
|
||||
while (messageQueue.Count > 0)
|
||||
{
|
||||
Tuple<ClientData, HttpMessage> tuple = messageQueue.Dequeue();
|
||||
server.QueueMessage(tuple.Item1, tuple.Item2.GetResponse(true));
|
||||
Tuple<ClientData, HttpMessage> tuple = null;
|
||||
if (messageQueue.TryDequeue(out tuple))
|
||||
{
|
||||
server.QueueMessage(tuple.Item1, tuple.Item2.GetResponse(true));
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -296,13 +296,13 @@ namespace MTSC.Server
|
||||
}
|
||||
}
|
||||
});
|
||||
foreach(IHandler handler in handlers)
|
||||
Parallel.ForEach(handlers, (handler) =>
|
||||
{
|
||||
try
|
||||
{
|
||||
handler.Tick(this);
|
||||
}
|
||||
catch(Exception e)
|
||||
catch (Exception e)
|
||||
{
|
||||
LogDebug("Exception: " + e.Message);
|
||||
LogDebug("Stacktrace: " + e.StackTrace);
|
||||
@@ -314,7 +314,7 @@ namespace MTSC.Server
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
/*
|
||||
* Check if there are messages queued to be sent.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user