Files
BeWoPlaner/BeWoChatServer/Server.cs

194 lines
6.5 KiB
C#
Raw Normal View History

2016-07-18 06:14:17 +02:00
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
2016-07-25 09:23:22 +02:00
2016-07-18 06:14:17 +02:00
using BeWo.Data;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BS.Shared;
namespace BeWoChatServer
{
public class Server
{
2016-07-25 09:23:22 +02:00
// Fehlercodes zwischen 1000 und 1499
//TODO: Login hier implementieren und das andere Projekt löschen
private static readonly object _Lock = string.Empty;
2016-07-18 06:14:17 +02:00
private static readonly Dictionary<Socket, long> clientList = new Dictionary<Socket, long>();
protected static Socket serverSocket;
private static AsyncCallback asyncCallback;
private static int clientCount;
public static void Main(string[] args)
{
try
{
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var server = new IPEndPoint(IPAddress.Any, 5000);
serverSocket.Bind(server);
serverSocket.Listen(4);
serverSocket.BeginAccept(OnClientConnected, null);
while (true) { }
}
catch (Exception e)
{
Debug.WriteLine("ChatServerException: " + e.Message);
}
}
public static void OnClientConnected(IAsyncResult asyncResult)
{
try
{
var workerSocket = serverSocket.EndAccept(asyncResult);
Interlocked.Increment(ref clientCount);
clientList.Add(workerSocket, 0);
2016-07-25 09:23:22 +02:00
WaitForClientData(workerSocket, "", 0, 0);
2016-07-18 06:14:17 +02:00
serverSocket.BeginAccept(OnClientConnected, null);
}
catch (SocketException e)
{
Debug.WriteLine("ChatServerException: " + e.Message);
}
}
2016-07-25 09:23:22 +02:00
public static void WaitForClientData(Socket socket, string clientName, long oid, long recipientPersonOid)
2016-07-18 06:14:17 +02:00
{
try
{
if (asyncCallback == null)
{
asyncCallback = OnReceiveData;
}
2016-07-25 09:23:22 +02:00
var packet = new Packet(socket, clientName, oid, recipientPersonOid);
2016-07-18 06:14:17 +02:00
socket.BeginReceive(packet.DataBuffer, 0, packet.DataBuffer.Length, SocketFlags.None, asyncCallback, packet);
}
catch (Exception e)
{
Debug.WriteLine("ChatServerException: " + e.Message);
}
}
public static void OnReceiveData(IAsyncResult asyncResult)
{
var dataPacket = (Packet) asyncResult.AsyncState;
2016-07-25 09:23:22 +02:00
Debug.WriteLine("Nachricht erhalten " + DateTime.Now);
2016-07-18 06:14:17 +02:00
try
{
var responseByteCount = dataPacket.Socket.EndReceive(asyncResult);
var chars = new char[responseByteCount];
var decoder = Encoding.UTF8.GetDecoder();
decoder.GetChars(dataPacket.DataBuffer, 0, responseByteCount, chars, 0);
if(chars.Count(f => f.Equals(';')) >= 4)
{
var message = new string(chars);
dataPacket.GetData(message);
}
switch(dataPacket.DataIdentifier) {
case DataIdentifier.Login:
2016-07-18 06:14:17 +02:00
var endPoint = dataPacket.Socket.RemoteEndPoint;
var endPointCollection = clientList.Select(s => s.Key.RemoteEndPoint).ToList();
var istEnthalten = endPointCollection.Contains(endPoint);
if(istEnthalten)
{
clientList[dataPacket.Socket] = dataPacket.SenderPersonOid;
}
2016-07-25 09:23:22 +02:00
//foreach(var client in clientList)
//{
// client.Key.Send(Encoding.UTF8.GetBytes("Client eingeloggt"));
//}
2016-07-18 06:14:17 +02:00
break;
case DataIdentifier.Message:
if(responseByteCount == 0)
{
clientList.Remove(dataPacket.Socket);
return;
}
else
{
try
{
Monitor.Enter(_Lock);
2016-07-25 09:23:22 +02:00
DefaultHibernateSessionManager.CurrentTenant = dataPacket.Tenant;
2016-07-18 06:14:17 +02:00
2016-07-25 09:23:22 +02:00
var chatMessage = new ChatMessage
{
SenderPersonOid = dataPacket.SenderPersonOid,
ChatText = dataPacket.ChatMessage,
EmpfängerPersonOid = dataPacket.RecipientPersonOid,
Uhrzeit = dataPacket.MessageTimeStamp,
InsUser = dataPacket.ClientName
};
DAOFactory.GenericDAO.Insert(chatMessage);
if(dataPacket.RecipientPersonOid > 0 && clientList.ContainsValue(dataPacket.RecipientPersonOid))
{
var recipients = clientList.Where(w => w.Value.Equals(dataPacket.RecipientPersonOid));
foreach(var recipient in recipients)
{
recipient.Key.Send(dataPacket.GetDataStream());
}
}
2016-07-18 06:14:17 +02:00
}
finally
{
Monitor.Exit(_Lock);
}
}
break;
case DataIdentifier.Logout:
break;
}
2016-07-25 09:23:22 +02:00
WaitForClientData(dataPacket.Socket, dataPacket.ClientName, dataPacket.SenderPersonOid, dataPacket.RecipientPersonOid);
2016-07-18 06:14:17 +02:00
}
catch (Exception e)
{
2016-07-25 09:23:22 +02:00
var sender = dataPacket.Socket;
if(clientList.ContainsKey(sender))
{
clientList.Remove(sender);
sender.Close();
}
2016-07-18 06:14:17 +02:00
Debug.WriteLine("ChatServerException: " + e.Message);
}
}
}
}