BeWo Server-Client update
This commit is contained in:
@@ -69,7 +69,6 @@
|
||||
<Reference Include="WindowsBase" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Packet.cs" />
|
||||
<Compile Include="Server.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -6,6 +6,7 @@ using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
|
||||
using BeWo.Data;
|
||||
using BeWo.Data.Access;
|
||||
using BeWo.Data.Entities;
|
||||
@@ -16,7 +17,10 @@ namespace BeWoChatServer
|
||||
{
|
||||
public class Server
|
||||
{
|
||||
private static object _Lock = string.Empty;
|
||||
// Fehlercodes zwischen 1000 und 1499
|
||||
//TODO: Login hier implementieren und das andere Projekt löschen
|
||||
|
||||
private static readonly object _Lock = string.Empty;
|
||||
|
||||
private static readonly Dictionary<Socket, long> clientList = new Dictionary<Socket, long>();
|
||||
protected static Socket serverSocket;
|
||||
@@ -25,17 +29,10 @@ namespace BeWoChatServer
|
||||
|
||||
private static int clientCount;
|
||||
|
||||
static Packet dataPacketsdf;
|
||||
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Benutzt den DefaultHibernateSessionManager
|
||||
DefaultHibernateSessionManager.CurrentTenant = "demo";
|
||||
DefaultHibernateSessionManager.OpenSession();
|
||||
var test = DAOFactory.GenericDAO.LoadByID<ChatMessage>(1);
|
||||
|
||||
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||||
|
||||
var server = new IPEndPoint(IPAddress.Any, 5000);
|
||||
@@ -53,8 +50,6 @@ namespace BeWoChatServer
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: Datenbankverbindung herstellen
|
||||
|
||||
public static void OnClientConnected(IAsyncResult asyncResult)
|
||||
{
|
||||
try
|
||||
@@ -65,7 +60,7 @@ namespace BeWoChatServer
|
||||
|
||||
clientList.Add(workerSocket, 0);
|
||||
|
||||
WaitForClientData(workerSocket, clientCount, "LEER", 0, 0);
|
||||
WaitForClientData(workerSocket, "", 0, 0);
|
||||
|
||||
serverSocket.BeginAccept(OnClientConnected, null);
|
||||
}
|
||||
@@ -75,7 +70,7 @@ namespace BeWoChatServer
|
||||
}
|
||||
}
|
||||
|
||||
public static void WaitForClientData(Socket socket, int clientNumber, string clientName, long oid, long recipientPersonOid)
|
||||
public static void WaitForClientData(Socket socket, string clientName, long oid, long recipientPersonOid)
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -84,7 +79,7 @@ namespace BeWoChatServer
|
||||
asyncCallback = OnReceiveData;
|
||||
}
|
||||
|
||||
var packet = new Packet(socket, clientNumber, clientName, oid, recipientPersonOid);
|
||||
var packet = new Packet(socket, clientName, oid, recipientPersonOid);
|
||||
|
||||
socket.BeginReceive(packet.DataBuffer, 0, packet.DataBuffer.Length, SocketFlags.None, asyncCallback, packet);
|
||||
}
|
||||
@@ -98,6 +93,8 @@ namespace BeWoChatServer
|
||||
{
|
||||
var dataPacket = (Packet) asyncResult.AsyncState;
|
||||
|
||||
Debug.WriteLine("Nachricht erhalten " + DateTime.Now);
|
||||
|
||||
try
|
||||
{
|
||||
var responseByteCount = dataPacket.Socket.EndReceive(asyncResult);
|
||||
@@ -114,8 +111,6 @@ namespace BeWoChatServer
|
||||
dataPacket.GetData(message);
|
||||
}
|
||||
|
||||
// Nur bei DataIdentifier.Login
|
||||
//TODO: SenderOid im Dictionary speichern
|
||||
switch(dataPacket.DataIdentifier) {
|
||||
case DataIdentifier.Login:
|
||||
var endPoint = dataPacket.Socket.RemoteEndPoint;
|
||||
@@ -127,6 +122,12 @@ namespace BeWoChatServer
|
||||
{
|
||||
clientList[dataPacket.Socket] = dataPacket.SenderPersonOid;
|
||||
}
|
||||
|
||||
//foreach(var client in clientList)
|
||||
//{
|
||||
// client.Key.Send(Encoding.UTF8.GetBytes("Client eingeloggt"));
|
||||
//}
|
||||
|
||||
break;
|
||||
case DataIdentifier.Message:
|
||||
if(responseByteCount == 0)
|
||||
@@ -136,21 +137,37 @@ namespace BeWoChatServer
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
Monitor.Enter(_Lock);
|
||||
|
||||
DefaultHibernateSessionManager.CurrentTenant = "demo";
|
||||
DefaultHibernateSessionManager.CurrentTenant = dataPacket.Tenant;
|
||||
|
||||
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());
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
Monitor.Exit(_Lock);
|
||||
}
|
||||
|
||||
|
||||
// in DB speichern und an evtl. an den Empfänger schicken, sofern dieser in der clientList enthalten ist
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -158,10 +175,18 @@ namespace BeWoChatServer
|
||||
break;
|
||||
}
|
||||
|
||||
WaitForClientData(dataPacket.Socket, dataPacket.ClientNumber, dataPacket.ClientName, dataPacket.SenderPersonOid, dataPacket.RecipientPersonOid);
|
||||
WaitForClientData(dataPacket.Socket, dataPacket.ClientName, dataPacket.SenderPersonOid, dataPacket.RecipientPersonOid);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
var sender = dataPacket.Socket;
|
||||
|
||||
if(clientList.ContainsKey(sender))
|
||||
{
|
||||
clientList.Remove(sender);
|
||||
sender.Close();
|
||||
}
|
||||
|
||||
Debug.WriteLine("ChatServerException: " + e.Message);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user