Клиент-Сервер: приватные сообщения в чате - C#

Узнай цену своей работы

Формулировка задачи:

Добрый вечер. Делая приложения Клиент-Сервер на чистых сокетах, столкнулся с несколькими проблемами, прошу помощи в решении их. У программы есть своя БД. В программе хочу реализовать чат. Так вот, в общую комнату отправляю сообщение, а вот что бы отправить приватное сообщение как быть??? Сервер должен конектится к этому пользователю простым конектом??? или нужно создавать новый сокет и через него привязываться??? И еще небольшая проблема в сторону остановки сервера. Никак не могу понять как можно остановить асинхронную работу сервера? Я не прошу писать программу, прошу направления на устранения этих проблем.

Решение задачи: «Клиент-Сервер: приватные сообщения в чате»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. public class Server
  5. {
  6.     public delegate void StartListenerEventHanlder(object sender, EventArgs e);
  7.     public event StartListenerEventHanlder StartListener;
  8.  
  9.     public delegate void EndListenerEventHanlder(object sender, EventArgs e);
  10.     public event EndListenerEventHanlder EndListener;
  11.  
  12.     public delegate void ReceiveDataEventHandler(object sender, ReceiveDataEventArgs e);
  13.     public event ReceiveDataEventHandler ReceiveData;
  14.  
  15.     public delegate void ConnectedSocketEventHanlder(object sender, ConnectedSocketEventArgs e);
  16.     public event ConnectedSocketEventHanlder ConnectedSocket;
  17.  
  18.     public delegate void DisconnectedSocketEventHandler(object sender, DisconnectedSocketEventArgs e);
  19.     public event DisconnectedSocketEventHandler DisconnectedSocket;
  20.  
  21.     private System.Net.Sockets.TcpListener TcpListener;
  22.     private System.Threading.SynchronizationContext Current;
  23.     private System.Collections.Generic.Dictionary<System.Net.EndPoint, System.Net.Sockets.Socket> DefaultClients = new System.Collections.Generic.Dictionary<System.Net.EndPoint, System.Net.Sockets.Socket>();
  24.  
  25.     public Server() { }
  26.  
  27.     public bool IsListener { get; private set; }
  28.  
  29.  
  30.     public void Start(System.Net.IPEndPoint endPoint)
  31.     {
  32.         if (TcpListener == null)
  33.         {
  34.             DefaultClients.Clear();
  35.             Current = System.Threading.SynchronizationContext.Current;
  36.             TcpListener = new System.Net.Sockets.TcpListener(endPoint);
  37.             TcpListener.Start();
  38.             System.Threading.Thread T = new System.Threading.Thread(OnAcceptSockets);
  39.             T.IsBackground = true; T.Start(); IsListener = true;
  40.             if (StartListener != null) StartListener.Invoke(this, new EventArgs());
  41.         }
  42.     }
  43.  
  44.     public void Stop()
  45.     {
  46.        if (TcpListener != null)
  47.        {
  48.            IsListener = false; TcpListener.Stop(); TcpListener = null;
  49.            DefaultClients.Clear(); EndListener.Invoke(this, new EventArgs());
  50.        }
  51.     }
  52.  
  53.     public System.Collections.Generic.Dictionary<System.Net.EndPoint, System.Net.Sockets.Socket> Clients { get { return DefaultClients; } }
  54.  
  55.     private void OnAcceptSockets()
  56.     {
  57.         while (IsListener)
  58.             {
  59.                 try
  60.                 {
  61.                     System.Net.Sockets.Socket AcceptSocket = TcpListener.AcceptSocket();
  62.                     DefaultClients.Add(AcceptSocket.RemoteEndPoint, AcceptSocket);
  63.                     if (ConnectedSocket != null) ConnectedSocket.Invoke(this, new ConnectedSocketEventArgs(AcceptSocket));
  64.                     System.Threading.Thread T = new System.Threading.Thread(OnReceiveSocket);
  65.                     T.IsBackground = true;
  66.                     T.Start(AcceptSocket);
  67.                 }
  68.                 catch { }
  69.             }
  70.     }
  71.  
  72.     private void OnReceiveSocket(object e)
  73.     {
  74.         System.Net.Sockets.Socket ClientSocket = (System.Net.Sockets.Socket)e;
  75.         System.Net.EndPoint RemoteEndPoint = ClientSocket.RemoteEndPoint;
  76.         int ReceiveLength;
  77.         int BufferLength = 255;
  78.         byte[] BufferReceive = new byte[BufferLength];
  79.         try
  80.         {
  81.            while (true)
  82.            {
  83.               ReceiveLength= ClientSocket.Receive(BufferReceive);
  84.               if (ReceiveLength == 0) { break; }
  85.               Array.Resize(ref BufferReceive, ReceiveLength);
  86.               ReceiveDataEventArgs EventArgs = new ReceiveDataEventArgs(RemoteEndPoint, BufferReceive, ClientSocket.Available, ClientSocket);
  87.               if (ReceiveData != null) ReceiveData.Invoke(this, EventArgs);
  88.               Array.Resize(ref BufferReceive, BufferLength);
  89.            }
  90.         }
  91.         catch { }
  92.         DefaultClients.Remove(RemoteEndPoint);
  93.         if (DisconnectedSocket != null) DisconnectedSocket.Invoke(this, new DisconnectedSocketEventArgs(RemoteEndPoint));
  94.     }
  95.  
  96.     public void KickAll()
  97.     {
  98.         foreach(System.Net.Sockets.Socket e in DefaultClients.Values )
  99.         {
  100.               e.Close();
  101.               if (DisconnectedSocket != null) DisconnectedSocket.Invoke(this, new DisconnectedSocketEventArgs(e.RemoteEndPoint));
  102.         }
  103.         DefaultClients.Clear();
  104.     }
  105.  
  106.     public void Kick(System.Net.EndPoint e )
  107.     {
  108.         if (DefaultClients.ContainsKey(e))
  109.         {
  110.             DefaultClients[e].Close();
  111.             DefaultClients.Remove(e);
  112.             if (DisconnectedSocket != null) DisconnectedSocket.Invoke(this, new DisconnectedSocketEventArgs(e));
  113.         }
  114.     }
  115.  
  116.     //отправить приватное сообщение.
  117.     public void Send(byte[] buf, System.Net.EndPoint e) { if (DefaultClients.ContainsKey(e)) { DefaultClients[e].Send(buf); } }
  118.    
  119.     //отправить приватное сообщение.
  120.     public void Send(string buf, System.Net.EndPoint e) { if (DefaultClients.ContainsKey(e)) { DefaultClients[e].Send(System.Text.Encoding.Default.GetBytes(buf)); } }
  121.  
  122.     public void SendAll(byte[] buf) { foreach (System.Net.Sockets.Socket e in DefaultClients.Values) { e.Send(buf); } }
  123.  
  124.     public void SendAll(string buf) { foreach (System.Net.Sockets.Socket e in DefaultClients.Values) { e.Send(System.Text.Encoding.Default.GetBytes(buf)); } }
  125.  
  126.     public void SendFile(string path, System.Net.EndPoint e) { if (DefaultClients.ContainsKey(e)) { DefaultClients[e].SendFile(path); } }
  127.  
  128.     public void SendFile(string path) { foreach (System.Net.Sockets.Socket e in DefaultClients.Values) { e.SendFile(path); } }
  129.  
  130. }
  131.  
  132.  
  133. public class ReceiveDataEventArgs: EventArgs
  134. {
  135.     public ReceiveDataEventArgs(System.Net.EndPoint endPoint, byte[] buf, int available,System.Net.Sockets.Socket sock)
  136.     { RemoteEndPoint = endPoint; Buffer = buf; Available = available; ClientSocket = sock; }
  137.  
  138.     public System.Net.EndPoint RemoteEndPoint { get; private set; }
  139.     public byte[] Buffer { get; private set; }
  140.     public int Available { get; private set; }
  141.     public System.Net.Sockets.Socket ClientSocket { get; private set; }
  142. }
  143. public class ConnectedSocketEventArgs: EventArgs
  144. {
  145.     public ConnectedSocketEventArgs(System.Net.Sockets.Socket sock) { ClientSocket = sock; }
  146.     public System.Net.Sockets.Socket ClientSocket { get; private set; }
  147. }
  148.  
  149. public class DisconnectedSocketEventArgs : EventArgs
  150. {
  151.     public DisconnectedSocketEventArgs(System.Net.EndPoint endPoint) { RemoteEndPoint = endPoint; }
  152.     public System.Net.EndPoint RemoteEndPoint { get; private set; }
  153. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы