Клиент-Сервер: приватные сообщения в чате - C#
Формулировка задачи:
Добрый вечер. Делая приложения Клиент-Сервер на чистых сокетах, столкнулся с несколькими проблемами, прошу помощи в решении их. У программы есть своя БД. В программе хочу реализовать чат. Так вот, в общую комнату отправляю сообщение, а вот что бы отправить приватное сообщение как быть??? Сервер должен конектится к этому пользователю простым конектом??? или нужно создавать новый сокет и через него привязываться??? И еще небольшая проблема в сторону остановки сервера. Никак не могу понять как можно остановить асинхронную работу сервера? Я не прошу писать программу, прошу направления на устранения этих проблем.
Решение задачи: «Клиент-Сервер: приватные сообщения в чате»
textual
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.Text;
- public class Server
- {
- public delegate void StartListenerEventHanlder(object sender, EventArgs e);
- public event StartListenerEventHanlder StartListener;
- public delegate void EndListenerEventHanlder(object sender, EventArgs e);
- public event EndListenerEventHanlder EndListener;
- public delegate void ReceiveDataEventHandler(object sender, ReceiveDataEventArgs e);
- public event ReceiveDataEventHandler ReceiveData;
- public delegate void ConnectedSocketEventHanlder(object sender, ConnectedSocketEventArgs e);
- public event ConnectedSocketEventHanlder ConnectedSocket;
- public delegate void DisconnectedSocketEventHandler(object sender, DisconnectedSocketEventArgs e);
- public event DisconnectedSocketEventHandler DisconnectedSocket;
- private System.Net.Sockets.TcpListener TcpListener;
- private System.Threading.SynchronizationContext Current;
- 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>();
- public Server() { }
- public bool IsListener { get; private set; }
- public void Start(System.Net.IPEndPoint endPoint)
- {
- if (TcpListener == null)
- {
- DefaultClients.Clear();
- Current = System.Threading.SynchronizationContext.Current;
- TcpListener = new System.Net.Sockets.TcpListener(endPoint);
- TcpListener.Start();
- System.Threading.Thread T = new System.Threading.Thread(OnAcceptSockets);
- T.IsBackground = true; T.Start(); IsListener = true;
- if (StartListener != null) StartListener.Invoke(this, new EventArgs());
- }
- }
- public void Stop()
- {
- if (TcpListener != null)
- {
- IsListener = false; TcpListener.Stop(); TcpListener = null;
- DefaultClients.Clear(); EndListener.Invoke(this, new EventArgs());
- }
- }
- public System.Collections.Generic.Dictionary<System.Net.EndPoint, System.Net.Sockets.Socket> Clients { get { return DefaultClients; } }
- private void OnAcceptSockets()
- {
- while (IsListener)
- {
- try
- {
- System.Net.Sockets.Socket AcceptSocket = TcpListener.AcceptSocket();
- DefaultClients.Add(AcceptSocket.RemoteEndPoint, AcceptSocket);
- if (ConnectedSocket != null) ConnectedSocket.Invoke(this, new ConnectedSocketEventArgs(AcceptSocket));
- System.Threading.Thread T = new System.Threading.Thread(OnReceiveSocket);
- T.IsBackground = true;
- T.Start(AcceptSocket);
- }
- catch { }
- }
- }
- private void OnReceiveSocket(object e)
- {
- System.Net.Sockets.Socket ClientSocket = (System.Net.Sockets.Socket)e;
- System.Net.EndPoint RemoteEndPoint = ClientSocket.RemoteEndPoint;
- int ReceiveLength;
- int BufferLength = 255;
- byte[] BufferReceive = new byte[BufferLength];
- try
- {
- while (true)
- {
- ReceiveLength= ClientSocket.Receive(BufferReceive);
- if (ReceiveLength == 0) { break; }
- Array.Resize(ref BufferReceive, ReceiveLength);
- ReceiveDataEventArgs EventArgs = new ReceiveDataEventArgs(RemoteEndPoint, BufferReceive, ClientSocket.Available, ClientSocket);
- if (ReceiveData != null) ReceiveData.Invoke(this, EventArgs);
- Array.Resize(ref BufferReceive, BufferLength);
- }
- }
- catch { }
- DefaultClients.Remove(RemoteEndPoint);
- if (DisconnectedSocket != null) DisconnectedSocket.Invoke(this, new DisconnectedSocketEventArgs(RemoteEndPoint));
- }
- public void KickAll()
- {
- foreach(System.Net.Sockets.Socket e in DefaultClients.Values )
- {
- e.Close();
- if (DisconnectedSocket != null) DisconnectedSocket.Invoke(this, new DisconnectedSocketEventArgs(e.RemoteEndPoint));
- }
- DefaultClients.Clear();
- }
- public void Kick(System.Net.EndPoint e )
- {
- if (DefaultClients.ContainsKey(e))
- {
- DefaultClients[e].Close();
- DefaultClients.Remove(e);
- if (DisconnectedSocket != null) DisconnectedSocket.Invoke(this, new DisconnectedSocketEventArgs(e));
- }
- }
- //отправить приватное сообщение.
- public void Send(byte[] buf, System.Net.EndPoint e) { if (DefaultClients.ContainsKey(e)) { DefaultClients[e].Send(buf); } }
- //отправить приватное сообщение.
- public void Send(string buf, System.Net.EndPoint e) { if (DefaultClients.ContainsKey(e)) { DefaultClients[e].Send(System.Text.Encoding.Default.GetBytes(buf)); } }
- public void SendAll(byte[] buf) { foreach (System.Net.Sockets.Socket e in DefaultClients.Values) { e.Send(buf); } }
- public void SendAll(string buf) { foreach (System.Net.Sockets.Socket e in DefaultClients.Values) { e.Send(System.Text.Encoding.Default.GetBytes(buf)); } }
- public void SendFile(string path, System.Net.EndPoint e) { if (DefaultClients.ContainsKey(e)) { DefaultClients[e].SendFile(path); } }
- public void SendFile(string path) { foreach (System.Net.Sockets.Socket e in DefaultClients.Values) { e.SendFile(path); } }
- }
- public class ReceiveDataEventArgs: EventArgs
- {
- public ReceiveDataEventArgs(System.Net.EndPoint endPoint, byte[] buf, int available,System.Net.Sockets.Socket sock)
- { RemoteEndPoint = endPoint; Buffer = buf; Available = available; ClientSocket = sock; }
- public System.Net.EndPoint RemoteEndPoint { get; private set; }
- public byte[] Buffer { get; private set; }
- public int Available { get; private set; }
- public System.Net.Sockets.Socket ClientSocket { get; private set; }
- }
- public class ConnectedSocketEventArgs: EventArgs
- {
- public ConnectedSocketEventArgs(System.Net.Sockets.Socket sock) { ClientSocket = sock; }
- public System.Net.Sockets.Socket ClientSocket { get; private set; }
- }
- public class DisconnectedSocketEventArgs : EventArgs
- {
- public DisconnectedSocketEventArgs(System.Net.EndPoint endPoint) { RemoteEndPoint = endPoint; }
- public System.Net.EndPoint RemoteEndPoint { get; private set; }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д