2016-07-18 06:14:17 +02:00
using System ;
2016-11-21 11:25:24 +01:00
using System.Collections ;
2016-09-13 11:32:25 +02:00
using System.Collections.Concurrent ;
2016-07-18 06:14:17 +02:00
using System.Collections.Generic ;
2016-11-21 11:25:24 +01:00
using System.Diagnostics ;
2016-07-18 06:14:17 +02:00
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 ;
2016-09-13 11:32:25 +02:00
using BS.Shared.Extensions ;
2016-07-29 13:08:32 +02:00
2016-07-18 06:14:17 +02:00
namespace BeWoChatServer
{
public class Server
{
2016-07-25 09:23:22 +02:00
// Fehlercodes zwischen 1000 und 1499
private static readonly object _Lock = string . Empty ;
2016-07-18 06:14:17 +02:00
2016-09-13 11:32:25 +02:00
private static readonly ConcurrentDictionary < Socket , LoginData > clientList = new ConcurrentDictionary < Socket , LoginData > ( ) ;
2016-07-18 06:14:17 +02:00
protected static Socket serverSocket ;
private static AsyncCallback asyncCallback ;
private static int clientCount ;
public static void Main ( string [ ] args )
{
try
{
2016-08-24 13:06:27 +02:00
Console . WriteLine ( DateTime . Now + ": Starte Server" ) ;
2016-07-18 06:14:17 +02:00
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 )
{
2016-11-21 11:25:24 +01:00
WriteErrorMessageToConsole ( e . Message , e . StackTrace , e ) ;
2016-07-18 06:14:17 +02:00
}
}
public static void OnClientConnected ( IAsyncResult asyncResult )
{
try
{
var workerSocket = serverSocket . EndAccept ( asyncResult ) ;
Interlocked . Increment ( ref clientCount ) ;
2016-09-13 11:32:25 +02:00
var couldAdd = clientList . TryAdd ( workerSocket , new LoginData ( 0 , "" , DateTime . Now ) ) ;
2016-07-18 06:14:17 +02:00
2016-09-13 11:32:25 +02:00
if ( ! couldAdd )
{
Console . WriteLine ( "Socket war schon in der clientListe enthalten und konnte nicht hinzugefügt werden" ) ;
}
Console . WriteLine ( DateTime . Now + ": Client hinzugefügt (" + workerSocket . RemoteEndPoint + ")" ) ;
2016-08-24 13:06:27 +02:00
2016-10-07 12:40:16 +02:00
WaitForClientData ( workerSocket , "" , 0 , 0 , true ) ;
2016-07-18 06:14:17 +02:00
serverSocket . BeginAccept ( OnClientConnected , null ) ;
2016-09-13 11:32:25 +02:00
LogAllClients ( ) ;
2016-07-18 06:14:17 +02:00
}
catch ( SocketException e )
{
2016-11-21 11:25:24 +01:00
WriteErrorMessageToConsole ( e . Message , e . StackTrace , e ) ;
2016-07-18 06:14:17 +02:00
}
}
2016-10-07 12:40:16 +02:00
public static void WaitForClientData ( Socket socket , string clientName , long oid , long recipientPersonOid , bool isEmployee )
2016-07-18 06:14:17 +02:00
{
try
{
if ( asyncCallback = = null )
{
asyncCallback = OnReceiveData ;
}
2016-10-07 12:40:16 +02:00
var packet = new Packet ( socket , clientName , oid , recipientPersonOid , isEmployee ) ;
2016-11-25 11:23:44 +01:00
2016-07-18 06:14:17 +02:00
socket . BeginReceive ( packet . DataBuffer , 0 , packet . DataBuffer . Length , SocketFlags . None , asyncCallback , packet ) ;
}
catch ( Exception e )
{
2016-11-21 11:25:24 +01:00
WriteErrorMessageToConsole ( e . Message , e . StackTrace , e ) ;
2016-07-18 06:14:17 +02:00
}
}
2016-09-13 11:32:25 +02:00
private static void LogAllClients ( )
{
Console . BackgroundColor = ConsoleColor . Black ;
Console . ForegroundColor = ConsoleColor . DarkMagenta ;
Console . WriteLine ( "Folgende Benutzer sind angemeldet:" ) ;
var abc = "" ;
clientList . DoForEach ( c = > abc + = "\t" + c . Key . RemoteEndPoint . ToString ( ) + "; Angemeldete Person: " + c . Value . PersonOid + "; MAC: " + c . Value . MacAddress + "; Zeitpunkt: " + c . Value . LoginTime . ToString ( "dd.MM.yyyy HH:mm:ss.ffff" ) + "\n" ) ;
Console . Write ( abc ) ;
Console . BackgroundColor = ConsoleColor . Black ;
Console . ForegroundColor = ConsoleColor . Gray ;
}
2016-07-18 06:14:17 +02:00
public static void OnReceiveData ( IAsyncResult asyncResult )
{
2016-11-21 11:25:24 +01:00
2016-07-18 06:14:17 +02:00
var dataPacket = ( Packet ) asyncResult . AsyncState ;
2016-12-05 17:08:51 +01:00
Console . WriteLine ( DateTime . Now + ": Empfange Nachricht (" + dataPacket . DataIdentifier . ToString ( ) + ")" ) ;
2016-08-24 13:06:27 +02:00
2016-09-13 11:32:25 +02:00
LogAllClients ( ) ;
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 ) ;
}
2016-10-21 09:41:14 +02:00
else
{
Console . WriteLine ( "dataPacket ist korrupt: " + dataPacket ) ;
}
switch ( dataPacket . DataIdentifier ) {
case DataIdentifier . KeepAlive :
2016-11-03 15:26:12 +01:00
//spiele Ping-Pong
var keepAlivePacket = new Packet (
dataPacket . Socket ,
dataPacket . ClientName ,
dataPacket . SenderPersonOid ,
0 ,
dataPacket . IsEmployee )
{
DataIdentifier = DataIdentifier . KeepAlive ,
Tenant = dataPacket . Tenant
} ;
dataPacket . Socket . Send ( keepAlivePacket . GetDataStream ( ) ) ;
2016-10-21 09:41:14 +02:00
break ;
2016-07-18 06:14:17 +02:00
2016-07-18 11:50:51 +02:00
case DataIdentifier . Login :
2016-08-17 12:20:27 +02:00
try
{
2016-09-13 11:32:25 +02:00
Console . WriteLine ( DateTime . Now + ": Login von " + dataPacket . ClientName + " mit MAC: " + dataPacket . ChatMessage ) ;
2016-08-17 12:20:27 +02:00
Monitor . Enter ( _Lock ) ;
2016-07-18 06:14:17 +02:00
2016-08-17 12:20:27 +02:00
var endPoint = dataPacket . Socket . RemoteEndPoint ;
2016-07-18 06:14:17 +02:00
2016-08-17 12:20:27 +02:00
var endPointCollection = clientList . Select ( s = > s . Key . RemoteEndPoint ) . ToList ( ) ;
2016-07-25 09:23:22 +02:00
2016-08-17 12:20:27 +02:00
var istEnthalten = endPointCollection . Contains ( endPoint ) ;
2016-09-13 11:32:25 +02:00
var alteLogins = clientList . Values . Any ( a = > a . MacAddress . Equals ( dataPacket . ChatMessage ) ) ;
if ( alteLogins )
{
var alt = clientList . Where ( w = > w . Value . MacAddress . Equals ( dataPacket . ChatMessage ) & & ! w . Key . Equals ( dataPacket . Socket ) ) ;
clientList . RemoveRange ( alt ) ;
}
2016-08-17 12:20:27 +02:00
if ( istEnthalten )
{
2016-09-13 11:32:25 +02:00
clientList [ dataPacket . Socket ] . PersonOid = dataPacket . SenderPersonOid ;
clientList [ dataPacket . Socket ] . MacAddress = dataPacket . ChatMessage ;
2016-08-17 12:20:27 +02:00
}
2016-07-25 14:48:35 +02:00
2016-10-21 09:41:14 +02:00
var notificationPacket = new Packet (
dataPacket . Socket ,
dataPacket . ClientName ,
dataPacket . SenderPersonOid ,
0 ,
dataPacket . IsEmployee )
{
DataIdentifier = DataIdentifier . StatusNotificationLogin ,
Tenant = dataPacket . Tenant
} ;
2016-07-25 09:23:22 +02:00
2016-09-13 11:32:25 +02:00
Console . WriteLine ( DateTime . Now + ": Benachrichtige die anderen angemeldeten Clients. Alte Logins enthalten: " + alteLogins ) ;
foreach ( var client in clientList . Where ( w = > ! w . Value . PersonOid . Equals ( dataPacket . SenderPersonOid ) ) )
2016-08-17 12:20:27 +02:00
{
2016-10-21 09:41:14 +02:00
Console . WriteLine ( "Sende Login-Benachrichtigung an " + client . Value . MacAddress + " mit PersonOid " + client . Value . PersonOid ) ;
2016-08-17 12:20:27 +02:00
client . Key . Send ( notificationPacket . GetDataStream ( ) ) ;
}
2016-07-26 15:51:30 +02:00
2016-10-07 12:40:16 +02:00
var successfulLoginNotification = new Packet ( dataPacket . Socket , dataPacket . ClientName , dataPacket . SenderPersonOid , 0 , dataPacket . IsEmployee ) { DataIdentifier = DataIdentifier . LoginSuccess , Tenant = dataPacket . Tenant } ;
2016-09-13 11:32:25 +02:00
dataPacket . Socket . Send ( successfulLoginNotification . GetDataStream ( ) ) ;
2016-08-17 12:20:27 +02:00
// Boradcast
2016-09-13 11:32:25 +02:00
var abc = clientList . Where ( w = > w . Value . PersonOid ! = dataPacket . SenderPersonOid & & w . Value . PersonOid > 0 ) . Select ( s = > s . Value . PersonOid ) . Distinct ( ) . ToList ( ) ;
2016-08-17 12:20:27 +02:00
var msg = "" ;
2016-07-26 15:51:30 +02:00
2016-08-17 12:20:27 +02:00
foreach ( var oid in abc )
2016-07-29 13:08:32 +02:00
{
2016-08-17 12:20:27 +02:00
msg + = oid ;
if ( abc . IndexOf ( oid ) ! = abc . Count - 1 )
{
msg + = "," ;
}
2016-07-29 13:08:32 +02:00
}
2016-08-17 12:20:27 +02:00
if ( msg . Length > 0 )
{
var packet = new Packet { ChatMessage = msg , ClientName = dataPacket . ClientName , DataIdentifier = DataIdentifier . StatusNotificationLoginBroadcast , MessageTimeStamp = DateTime . Now , Tenant = dataPacket . Tenant , SenderPersonOid = dataPacket . SenderPersonOid } ;
2016-07-29 13:08:32 +02:00
2016-08-17 12:20:27 +02:00
dataPacket . Socket . Send ( packet . GetDataStream ( ) ) ;
}
2016-09-13 11:32:25 +02:00
LogAllClients ( ) ;
2016-08-17 12:20:27 +02:00
}
finally
{
Monitor . Exit ( _Lock ) ;
2016-08-03 11:50:16 +02:00
}
2016-07-26 15:51:30 +02:00
2016-07-18 06:14:17 +02:00
break ;
case DataIdentifier . Message :
if ( responseByteCount = = 0 )
{
2016-08-17 12:20:27 +02:00
try
{
2016-08-24 13:06:27 +02:00
Console . WriteLine ( DateTime . Now + ": Chat-Nachricht ist leer und sorgt dafür, dass der Client ausgeloggt wird" ) ;
2016-08-17 12:20:27 +02:00
Monitor . Enter ( _Lock ) ;
2016-07-29 13:08:32 +02:00
2016-11-09 11:48:46 +01:00
var notificationPacketLogout2 = new Packet ( dataPacket . Socket , dataPacket . ClientName , dataPacket . SenderPersonOid , 0 , dataPacket . IsEmployee ) { DataIdentifier = DataIdentifier . StatusNotificationLogout , Tenant = dataPacket . Tenant } ;
2016-08-17 12:20:27 +02:00
2016-09-13 11:32:25 +02:00
LoginData wtf = null ;
var wasAbleToRemoveClient = clientList . TryRemove ( dataPacket . Socket , out wtf ) ;
if ( ! wasAbleToRemoveClient )
{
Console . WriteLine ( "Konnte den Client nicht aus der Liste entfernen." ) ;
}
2016-08-17 12:20:27 +02:00
2016-08-24 13:06:27 +02:00
Console . WriteLine ( DateTime . Now + ": Leite Logout an die anderen Clients weiter" ) ;
2016-08-17 12:20:27 +02:00
foreach ( var client in clientList )
{
client . Key . Send ( notificationPacketLogout2 . GetDataStream ( ) ) ;
}
dataPacket . Socket . Close ( ) ;
}
finally
2016-07-29 13:08:32 +02:00
{
2016-08-17 12:20:27 +02:00
Monitor . Exit ( _Lock ) ;
2016-07-29 13:08:32 +02:00
}
2016-07-18 06:14:17 +02:00
return ;
}
2016-10-07 12:40:16 +02:00
try
2016-07-18 06:14:17 +02:00
{
2016-10-07 12:40:16 +02:00
Console . BackgroundColor = ConsoleColor . Black ;
Console . ForegroundColor = ConsoleColor . DarkYellow ;
2016-10-21 09:41:14 +02:00
Console . WriteLine ( DateTime . Now + ": Chat-Nachricht erhalten: " + dataPacket . MessageTimeStamp . ToString ( "dd.MM.yyyy HH:mm:ss" ) ) ;
2016-10-07 12:40:16 +02:00
Console . BackgroundColor = ConsoleColor . Black ;
Console . ForegroundColor = ConsoleColor . Gray ;
2016-08-24 13:06:27 +02:00
2016-10-07 12:40:16 +02:00
Monitor . Enter ( _Lock ) ;
2016-07-18 06:14:17 +02:00
2016-10-07 12:40:16 +02:00
DefaultHibernateSessionManager . CurrentTenant = dataPacket . Tenant ;
2016-11-21 11:25:24 +01:00
2016-10-07 12:40:16 +02:00
var chatMessage = new ChatMessage
{
2016-11-21 11:25:24 +01:00
SenderPersonOid = dataPacket . SenderPersonOid ,
ChatText = Encoding . UTF8 . GetBytes ( dataPacket . ChatMessage ) ,
2016-10-07 12:40:16 +02:00
EmpfaengerPersonOid = dataPacket . RecipientPersonOid ,
2016-11-21 11:25:24 +01:00
Uhrzeit = DateTime . Now ,
InsUser = dataPacket . ClientName ,
IsDelivered = true ,
2016-11-24 16:03:41 +01:00
MessageId = dataPacket . MessageId ,
MediaTyp = dataPacket . MediaTyp
2016-10-07 12:40:16 +02:00
} ;
2016-07-25 09:23:22 +02:00
2016-10-21 09:41:14 +02:00
Console . WriteLine ( DateTime . Now + ": Speichere die Chat-Nachricht in der Datenbank" ) ;
2016-11-21 11:25:24 +01:00
2016-10-07 12:40:16 +02:00
DAOFactory . GenericDAO . Insert ( chatMessage ) ;
2016-11-30 13:42:50 +01:00
var newestMessage = DAOFactory . SearchDAO . GetNewestChatMessageForConversation ( dataPacket . RecipientPersonOid , dataPacket . SenderPersonOid , false ) ;
2016-12-05 17:08:51 +01:00
var newestChatMessage = new NewestChatMessage
2016-11-30 13:42:50 +01:00
{
ChatMessageOid = chatMessage . Oid ,
IsTeam = false ,
RecipientPersonOid = dataPacket . RecipientPersonOid ,
SenderPersonOid = dataPacket . SenderPersonOid
} ;
if ( newestMessage ! = null )
{
DAOFactory . GenericDAO . Delete ( newestMessage ) ;
}
DAOFactory . GenericDAO . Insert ( newestChatMessage ) ;
2016-07-25 09:23:22 +02:00
2016-11-24 16:03:41 +01:00
//Media Bereich mit Bild und Dok.
if ( dataPacket . MediaDatei ! = null )
{
byte [ ] media = dataPacket . MediaDatei ;
byte [ ] ThImage = null ;
if ( dataPacket . MediaTyp = = 1 )
{
ThImage = media ;
}
var chatMediaMessage = new ChatMediaMessage
{
Media = media ,
InsUser = dataPacket . ClientName ,
ImageThumpNail = BS . Shared . Core . Utils . ErstelleThumbnail ( ThImage , 150 , 150 ) ,
ChatMessageOid = chatMessage . Oid
} ;
Console . WriteLine ( DateTime . Now + ": Speichere die Chat-Media-Nachricht in der Datenbank" ) ;
DAOFactory . GenericDAO . Insert ( chatMediaMessage ) ;
}
2016-10-07 12:40:16 +02:00
if ( chatMessage . Oid ! = null )
{
Console . WriteLine ( DateTime . Now + ": Chat-Nachricht erfolgreich mit Oid " + chatMessage . Oid . Value + " gespeichert" ) ;
dataPacket . ServerseitigeOid = chatMessage . Oid . Value ;
}
2016-07-29 13:08:32 +02:00
2016-10-07 12:40:16 +02:00
if ( dataPacket . RecipientPersonOid > 0 )
{
2016-11-21 11:25:24 +01:00
if ( clientList . Values . Any ( a = > a . PersonOid . Equals ( dataPacket . RecipientPersonOid ) ) )
2016-07-25 09:23:22 +02:00
{
2016-10-07 12:40:16 +02:00
var recipients = clientList . Where ( w = > w . Value . PersonOid . Equals ( dataPacket . RecipientPersonOid ) ) ;
2016-08-17 12:20:27 +02:00
2016-10-07 12:40:16 +02:00
Console . WriteLine ( DateTime . Now + ": Leite die Chat-Nachricht an die Empfänger (Derselbe User angemeldet an verschiedenen Clients) weiter" ) ;
foreach ( var recipient in recipients )
{
recipient . Key . Send ( dataPacket . GetDataStream ( ) ) ;
2016-07-25 09:23:22 +02:00
}
2016-10-07 12:40:16 +02:00
}
2016-08-05 16:23:58 +02:00
2016-10-07 12:40:16 +02:00
var packet = new Packet
{
2016-11-21 11:25:24 +01:00
ClientseitigeOid = dataPacket . ClientseitigeOid ,
ServerseitigeOid = dataPacket . ServerseitigeOid ,
DataIdentifier = DataIdentifier . MessageResponse ,
2016-10-21 09:41:14 +02:00
MessageTimeStamp = chatMessage . Uhrzeit ,
2016-11-21 11:25:24 +01:00
MessageId = dataPacket . MessageId
2016-10-07 12:40:16 +02:00
} ;
2016-08-08 09:00:44 +02:00
2016-10-07 12:40:16 +02:00
Console . WriteLine ( DateTime . Now + ": Sende Datenbank-Insert-Bestätigung an den Absender, damit die Nachricht später nicht doppelt auf den Client heruntergeladen wird" ) ;
dataPacket . Socket . Send ( packet . GetDataStream ( ) ) ;
2016-07-18 06:14:17 +02:00
}
}
2016-10-07 12:40:16 +02:00
finally
{
Monitor . Exit ( _Lock ) ;
}
2016-07-18 06:14:17 +02:00
break ;
case DataIdentifier . Logout :
2016-09-13 11:32:25 +02:00
LoginData ld ;
var wasAbleToRemoveClient2 = clientList . TryRemove ( dataPacket . Socket , out ld ) ;
if ( ! wasAbleToRemoveClient2 )
{
Console . WriteLine ( "Konnte den Client nicht aus der Liste entfernen." ) ;
}
2016-07-25 14:48:35 +02:00
2016-11-03 15:26:12 +01:00
var notificationPacketLogout = new Packet ( dataPacket . Socket , dataPacket . ClientName , dataPacket . SenderPersonOid , 0 , dataPacket . IsEmployee )
{
DataIdentifier = DataIdentifier . StatusNotificationLogout ,
Tenant = dataPacket . Tenant
} ;
2016-07-25 14:48:35 +02:00
2016-09-19 17:13:10 +02:00
Console . WriteLine ( DateTime . Now + ": Sende Logout von " + dataPacket . ClientName + " an alle anderen Clients" ) ;
2016-09-13 11:32:25 +02:00
foreach ( var client in clientList . Where ( w = > ! w . Value . PersonOid . Equals ( dataPacket . SenderPersonOid ) ) )
2016-07-25 14:48:35 +02:00
{
client . Key . Send ( notificationPacketLogout . GetDataStream ( ) ) ;
}
2016-09-13 11:32:25 +02:00
LogAllClients ( ) ;
2016-07-29 13:08:32 +02:00
break ;
2016-08-17 12:20:27 +02:00
case DataIdentifier . Team :
try
{
2016-08-24 13:06:27 +02:00
Console . WriteLine ( DateTime . Now + ": Team-Nachricht erhalten" ) ;
2016-08-17 12:20:27 +02:00
Monitor . Enter ( _Lock ) ;
DefaultHibernateSessionManager . CurrentTenant = dataPacket . Tenant ;
var chatMessage = new ChatMessage
{
SenderPersonOid = dataPacket . SenderPersonOid ,
2016-09-16 15:46:17 +02:00
ChatText = Encoding . UTF8 . GetBytes ( dataPacket . ChatMessage ) ,
2016-09-30 10:19:11 +02:00
EmpfaengerPersonOid = dataPacket . RecipientPersonOid ,
2016-08-17 12:20:27 +02:00
Uhrzeit = dataPacket . MessageTimeStamp ,
InsUser = dataPacket . ClientName ,
2016-10-21 09:41:14 +02:00
TeamOid = dataPacket . RecipientPersonOid ,
IsDelivered = true ,
2016-11-30 11:48:16 +01:00
MessageId = dataPacket . MessageId ,
MediaTyp = dataPacket . MediaTyp
2016-08-17 12:20:27 +02:00
} ;
var team = DAOFactory . GenericDAO . LoadByID < Team > ( dataPacket . RecipientPersonOid ) ;
2016-08-24 13:06:27 +02:00
Console . WriteLine ( DateTime . Now + ": Speichere Team-Nachricht in der Datenbank" ) ;
2016-08-17 12:20:27 +02:00
DAOFactory . GenericDAO . Insert ( chatMessage ) ;
2016-11-30 13:42:50 +01:00
var newestMessage = DAOFactory . SearchDAO . GetNewestChatMessageForConversation ( dataPacket . RecipientPersonOid , dataPacket . SenderPersonOid , true ) ;
2016-12-05 17:08:51 +01:00
var newestChatMessage = new NewestChatMessage
2016-11-30 13:42:50 +01:00
{
ChatMessageOid = chatMessage . Oid ,
IsTeam = true ,
RecipientPersonOid = dataPacket . RecipientPersonOid ,
SenderPersonOid = dataPacket . SenderPersonOid
} ;
if ( newestMessage ! = null )
{
DAOFactory . GenericDAO . Delete ( newestMessage ) ;
}
DAOFactory . GenericDAO . Insert ( newestChatMessage ) ;
2016-11-30 11:48:16 +01:00
//Media Bereich mit Bild und Dok.
if ( dataPacket . MediaDatei ! = null )
{
byte [ ] media = dataPacket . MediaDatei ;
byte [ ] ThImage = null ;
if ( dataPacket . MediaTyp = = 1 )
{
ThImage = media ;
}
var chatMediaMessage = new ChatMediaMessage
{
Media = media ,
InsUser = dataPacket . ClientName ,
ImageThumpNail = BS . Shared . Core . Utils . ErstelleThumbnail ( ThImage , 150 , 150 ) ,
ChatMessageOid = chatMessage . Oid
} ;
Console . WriteLine ( DateTime . Now + ": Speichere die Chat-Media-Nachricht in der Datenbank" ) ;
DAOFactory . GenericDAO . Insert ( chatMediaMessage ) ;
}
2016-08-17 12:20:27 +02:00
var personOids = team . MemberList . Select ( s = > s . Person . Oid . Value ) ;
if ( chatMessage . Oid ! = null )
{
2016-08-24 13:06:27 +02:00
Console . WriteLine ( DateTime . Now + ": Team-Nachricht erfolgreich mit Oid " + chatMessage . Oid . Value + " gespeichert" ) ;
2016-08-17 12:20:27 +02:00
dataPacket . ServerseitigeOid = chatMessage . Oid . Value ;
}
2016-08-24 13:06:27 +02:00
Console . WriteLine ( DateTime . Now + ": Leite die Team-Nachricht an die Empfänger weiter" ) ;
2016-09-13 11:32:25 +02:00
foreach ( var recipient in clientList . Where ( w = > w . Value . PersonOid ! = dataPacket . SenderPersonOid & & personOids . Contains ( w . Value . PersonOid ) ) )
2016-08-17 12:20:27 +02:00
{
recipient . Key . Send ( dataPacket . GetDataStream ( ) ) ;
}
var packet = new Packet
{
ClientseitigeOid = dataPacket . ClientseitigeOid ,
ServerseitigeOid = dataPacket . ServerseitigeOid ,
2016-10-21 09:41:14 +02:00
DataIdentifier = DataIdentifier . MessageResponse ,
MessageId = dataPacket . MessageId
2016-08-17 12:20:27 +02:00
} ;
2016-08-24 13:06:27 +02:00
Console . WriteLine ( DateTime . Now + ": Sende Datenbank-Insert-Bestätigung an den Absender, damit die Nachricht später nicht doppelt auf den Client heruntergeladen wird" ) ;
2016-08-17 12:20:27 +02:00
dataPacket . Socket . Send ( packet . GetDataStream ( ) ) ;
}
finally
{
Monitor . Exit ( _Lock ) ;
}
2016-07-29 13:08:32 +02:00
2016-08-24 11:31:13 +02:00
break ;
case DataIdentifier . StatusNotificationBeschäftigt :
SendNotificationPacket ( dataPacket , DataIdentifier . StatusNotificationBeschäftigt ) ;
break ;
case DataIdentifier . StatusNotificationOnline :
SendNotificationPacket ( dataPacket , DataIdentifier . StatusNotificationOnline ) ;
break ;
case DataIdentifier . StatusNotificationOffline :
SendNotificationPacket ( dataPacket , DataIdentifier . StatusNotificationOffline ) ;
2016-09-13 11:32:25 +02:00
break ;
case DataIdentifier . Null :
var asfdabc = dataPacket . ChatMessage ;
2016-09-16 14:44:58 +02:00
break ;
2016-09-19 17:13:10 +02:00
case DataIdentifier . StatusRequest :
var onlinePersons = clientList . Where ( w = > w . Value . PersonOid ! = dataPacket . SenderPersonOid & & w . Value . PersonOid > 0 ) . Select ( s = > s . Value . PersonOid ) . Distinct ( ) . ToList ( ) ;
var oidCSV = "" ;
2016-09-16 14:44:58 +02:00
2016-09-19 17:13:10 +02:00
foreach ( var oid in onlinePersons )
{
oidCSV + = oid ;
2016-09-16 14:44:58 +02:00
2016-09-19 17:13:10 +02:00
if ( onlinePersons . IndexOf ( oid ) ! = onlinePersons . Count - 1 )
{
oidCSV + = "," ;
}
}
2016-09-16 14:44:58 +02:00
2016-09-19 17:13:10 +02:00
if ( oidCSV . Length > 0 )
{
var packet = new Packet { ChatMessage = oidCSV , ClientName = dataPacket . ClientName , DataIdentifier = DataIdentifier . StatusRequest , MessageTimeStamp = DateTime . Now , Tenant = dataPacket . Tenant , SenderPersonOid = dataPacket . SenderPersonOid } ;
2016-09-16 14:44:58 +02:00
2016-09-19 17:13:10 +02:00
dataPacket . Socket . Send ( packet . GetDataStream ( ) ) ;
}
2016-09-16 14:44:58 +02:00
2016-07-18 06:14:17 +02:00
break ;
}
2016-10-07 12:40:16 +02:00
WaitForClientData ( dataPacket . Socket , dataPacket . ClientName , dataPacket . SenderPersonOid , dataPacket . RecipientPersonOid , dataPacket . IsEmployee ) ;
2016-07-18 06:14:17 +02:00
}
catch ( Exception e )
{
2016-09-19 17:13:10 +02:00
Console . WriteLine ( DateTime . Now + ": Ein Fehler ist aufgetreten oder die App ist abgestürzt. Der Client wird ausgeloggt (" + dataPacket . ClientName + ")" ) ;
2016-08-24 13:06:27 +02:00
2016-07-25 09:23:22 +02:00
var sender = dataPacket . Socket ;
2016-11-03 15:26:12 +01:00
var notificationPacketLogout = new Packet ( dataPacket . Socket , dataPacket . ClientName , dataPacket . SenderPersonOid , 0 , dataPacket . IsEmployee ) { DataIdentifier = DataIdentifier . StatusNotificationLogout , Tenant = dataPacket . Tenant } ;
2016-07-29 13:08:32 +02:00
2016-08-17 12:20:27 +02:00
try
2016-07-25 09:23:22 +02:00
{
2016-08-17 12:20:27 +02:00
Monitor . Enter ( _Lock ) ;
2016-07-29 13:08:32 +02:00
2016-08-17 12:20:27 +02:00
if ( clientList . ContainsKey ( sender ) )
2016-07-29 13:08:32 +02:00
{
2016-09-13 11:32:25 +02:00
LoginData loginData ;
var wasAbleToRemoveClient3 = clientList . TryRemove ( sender , out loginData ) ;
if ( ! wasAbleToRemoveClient3 )
{
Console . WriteLine ( "Konnte den Client nicht aus der Liste entfernen." ) ;
}
LogAllClients ( ) ;
2016-08-17 12:20:27 +02:00
2016-08-24 13:06:27 +02:00
Console . WriteLine ( DateTime . Now + ": Leite Logout an die anderen Clients weiter" ) ;
2016-08-17 12:20:27 +02:00
foreach ( var client in clientList )
{
client . Key . Send ( notificationPacketLogout . GetDataStream ( ) ) ;
}
2016-07-29 13:08:32 +02:00
2016-08-17 12:20:27 +02:00
sender . Close ( ) ;
}
}
2016-09-13 11:32:25 +02:00
catch ( SocketException se )
{
2016-11-21 11:25:24 +01:00
WriteErrorMessageToConsole ( se . Message , se . StackTrace , se ) ;
2016-09-13 11:32:25 +02:00
}
2016-08-17 12:20:27 +02:00
finally
{
Monitor . Exit ( _Lock ) ;
2016-07-25 09:23:22 +02:00
}
2016-11-21 11:25:24 +01:00
WriteErrorMessageToConsole ( e . Message , e . StackTrace , e ) ;
2016-07-18 06:14:17 +02:00
}
}
2016-08-24 11:31:13 +02:00
2016-12-05 17:08:51 +01:00
private static Random random = new Random ( ) ;
public static string RandomString ( int length )
{
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" ;
return new string ( Enumerable . Repeat ( chars , length )
. Select ( s = > s [ random . Next ( s . Length ) ] ) . ToArray ( ) ) ;
}
2016-08-24 11:31:13 +02:00
private static void SendNotificationPacket ( Packet dataPacket , DataIdentifier dataIdentifier )
{
2016-11-09 11:48:46 +01:00
var notificationPacket = new Packet ( dataPacket . Socket , dataPacket . ClientName , dataPacket . SenderPersonOid , 0 , dataPacket . IsEmployee ) { DataIdentifier = DataIdentifier . StatusNotificationLogout , Tenant = dataPacket . Tenant } ;
2016-08-24 11:31:13 +02:00
2016-08-24 13:06:27 +02:00
Console . WriteLine ( DateTime . Now + ": Sende Statusänderung(" + dataIdentifier + ") an alle anderen Clients" ) ;
2016-09-13 11:32:25 +02:00
foreach ( var client in clientList . Where ( w = > w . Value . PersonOid ! = dataPacket . SenderPersonOid ) )
2016-08-24 11:31:13 +02:00
{
client . Key . Send ( notificationPacket . GetDataStream ( ) ) ;
}
}
2016-08-25 13:13:30 +02:00
2016-11-21 11:25:24 +01:00
private static void WriteErrorMessageToConsole ( string message , string stackTrace , Exception ex = null )
2016-08-25 13:13:30 +02:00
{
Console . BackgroundColor = ConsoleColor . Black ;
Console . ForegroundColor = ConsoleColor . Red ;
Console . WriteLine ( DateTime . Now + ": " + message ) ;
Console . WriteLine ( stackTrace ) ;
2016-11-21 11:25:24 +01:00
if ( ex ! = null )
{
var st = new StackTrace ( ex , true ) ;
var frame = st . GetFrame ( st . FrameCount - 1 ) ;
var line = frame . GetFileLineNumber ( ) ;
Console . WriteLine ( "Zeile: " + line ) ;
}
2016-08-25 13:13:30 +02:00
Console . BackgroundColor = ConsoleColor . Black ;
Console . ForegroundColor = ConsoleColor . Gray ;
}
2016-07-18 06:14:17 +02:00
}
2016-09-13 11:32:25 +02:00
public class LoginData
{
public long PersonOid { get ; set ; }
public string MacAddress { get ; set ; }
public DateTime LoginTime { get ; set ; }
public LoginData ( long pPersonOid , string pMacAddress , DateTime pLoginTime )
{
PersonOid = pPersonOid ;
MacAddress = pMacAddress ;
LoginTime = pLoginTime ;
}
}
2016-07-18 06:14:17 +02:00
}