рдорд▓реНрдЯреА рдХреНрд▓рд╛рдЗрдВрдЯ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ C # рдореЗрдВ

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛


рдореИрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реВрдВ, рдЙрдореНрд░ рддрдХ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рдореЗрдВ рдЗрд╕реЗ рд╕реАрдЦрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдирд╣реАрдВ рдорд┐рд▓рд╛, рд▓реЗрдХрд┐рди рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╛рд▓рд╕рд╛ рд╣реИред рдореИрдВ рдЕрдкрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдореЗрдВ рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдореИрдВ рдЗрд╕рдореЗрдВ рдЕрдкрдиреА рдЦрд╛рдорд┐рдпреЛрдВ рдХреЛ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХрд┐рди рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдХрд┐рд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╣реИред
рдХрд╛рд░реНрдпрдХреНрд░рдо рдПрдХ рдмрд╣реБ-рдХреНрд▓рд╛рдЗрдВрдЯ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд░реНрд╡рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдкреИрдХреЗрдЯ рдФрд░ рдЙрдирдХреЗ рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред



рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рддреАрди рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


рд╕рд╛рдорд╛рдиреНрдп рднрд╛рдЧ


рдкреИрдХреЗрдЬ



рд╕рднреА рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕:

namespace Common { interface IPacket { void Write(BinaryWriter writer); //   } } 



рдПрдХ рд╕рд╛рд░ рд╡рд░реНрдЧ рдЬреЛ рд╣рдорд╛рд░реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рджреЗрддрд╛ рд╣реИ:

 namespace Common { abstract class PacketBase : IPacket { protected PacketBase(int id) { this.Id = id; } public int Id { get; private set; } protected void WriteHeader(BinaryWriter writer) { writer.Write(this.Id); } //    protected virtual void WriteBody(BinaryWriter writer) { } //    public void Write(BinaryWriter writer) { this.WriteHeader(writer); this.WriteBody(writer); } //    } } 


рдкреИрдХреЗрдЬ рд╣реИрдВрдбрд▓рд░


рд╕рднреА рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕:

 namespace Common { interface IPacketHandler : ICloneable { void Read(); //  void Handle(); //  } } 


рдПрдХ рд╕рд╛рд░ рд╡рд░реНрдЧ рдЬреЛ рдкреИрдХреЗрдЬ рд╣реИрдВрдбрд▓рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред

 namespace Common { abstract class PacketHandlerBase : IPacketHandler { public PacketHandlerBase() { } public BinaryReader Reader { get; set; } public object Context { get; set; } public virtual void Read() { } //  public virtual void Handle() { } //  public abstract Object Clone(); //,    } } 


рд╕рдВрджрд░реНрдн рд╡рд╣ рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рдХрдиреЗрдХреНрд╢рди рдкреИрдХреЗрдЯ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЗрд╕ рд╕рдВрджрд░реНрдн рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ рдФрд░ рдпрджрд┐ рд╡рд╣ рдЪрд╛рд╣реЗ рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╣реИрдВрдбрд▓рд░ рдХреА рджреБрдХрд╛рди



 namespace Common { class PacketHandlerStorage { public PacketHandlerStorage() { this._storage = new Dictionary(); } private Dictionary _storage; public PacketHandlerBase GetHandlerById(int id) { PacketHandlerBase x = this._storage[id]; return (PacketHandlerBase)x.Clone(); //      Clone } public void AddHandler(int id, PacketHandlerBase handler) { this._storage.Add(id, handler); } } } 


GetHandlerById рд╡рд┐рдзрд┐ рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рд╕рдВрдмрдВрдзрд┐рдд рдкреИрдХреЗрдЯ рд╣реИрдВрдбрд▓рд░ рд▓реМрдЯрд╛рддреА рд╣реИред AddHandler рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рдкрдврд╝рдиреЗ рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛



 namespace Common { class InputProcessor { public InputProcessor(NetworkStream stream, Connection connection, PacketHandlerStorage handlers) { this._connection = connection; this._stream = stream; this.Handlers = handlers; Reader = new BinaryReader(this._stream); this._started = false; } private NetworkStream _stream; private Connection _connection; //   private Thread _newThread; private BinaryReader Reader; private bool _started; public PacketHandlerStorage Handlers { get; set; } private void _handlePacket() { int id = Reader.ReadInt32(); // id  PacketHandlerBase handler = this.Handlers.GetHandlerById(id); //  handler.Reader = this.Reader; handler.Read(); //  this._connection.Receive(handler); //  } private void _worker() { while (!this._started) { _handlePacket(); } } public void Run() { this._newThread = new Thread(this._worker); this._newThread.Start(); } } } 


рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрдЯреНрд░реАрдо, рдХрдиреЗрдХреНрд╢рди рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБ рдФрд░ рд╣реИрдВрдбрд▓рд░ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреА рд╡рд╕реНрддреБ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред _handlePacket рдкреИрдХреЗрдЬ рдХреА рдЖрдИрдбреА рдкрдврд╝рддрд╛ рд╣реИ, рдЕрдкрдиреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рд░реАрдб рдФрд░ рдкреНрд░реЛрд╕реЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдПрдХ рд▓реВрдк рдореЗрдВ _worker _handlePacket рдХрд╣рддрд╛ рд╣реИред рд░рди рд╡рд┐рдзрд┐ рдПрдХ рдереНрд░реЗрдб рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ _worker рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИред

рдкреИрдХреЗрдЬ рд░рд┐рдХреЙрд░реНрдб рдХреНрд▓рд╛рд╕



 namespace Common { class OutputProccessor { public OutputProccessor(NetworkStream stream) { this._stream = stream; _writer = new BinaryWriter(this._stream); this.Packets = new Queue(); this._lock = new ManualResetEvent(true); } private Thread _newThread; private NetworkStream _stream; private BinaryWriter _writer; private Queue Packets; private ManualResetEvent _lock; private void _worker() { while (true) { this._lock.WaitOne(); if (this.Packets.Count > 0) //      this.Packets.Dequeue().Write(this._writer); //  else this._lock.Reset(); } } public void Send(PacketBase packet) //   { this.Packets.Enqueue(packet); this._lock.Set(); } public void Run() { this._newThread = new Thread(this._worker); this._newThread.Start(); } } } 


_Work рд╡рд┐рдзрд┐ рдореЗрдВ, рдкреИрдХреЗрдЯ рднреЗрдЬрдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рд▓реВрдк рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд╢рд░реНрддреЗ рдХрд┐ 0. рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛред рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рд░рди рд╡рд┐рдзрд┐ _worker рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред

рдХрдиреЗрдХреНрд╢рди рд╡рд░реНрдЧ


рдХрдХреНрд╖рд╛ рдХрдиреЗрдХреНрд╢рдиред рдирд╛рдо рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╡рд░реНрдЧ рд╣реИред

 namespace Common { class Connection { public Connection(TcpClient client, PacketHandlerStorage handlers) { this._client = client; this.Stream = this._client.GetStream(); this._inputProccessor = new InputProcessor(this.Stream, this, handlers); this._outputProccessor = new OutputProccessor(this.Stream); } private TcpClient _client; private InputProcessor _inputProccessor; //  /  private OutputProccessor _outputProccessor; //    public NetworkStream Stream { get; private set; } public object Context { get; set; } public void Run() { this._inputProccessor.Run(); this._outputProccessor.Run(); } public void Send(PacketBase packet) { this._outputProccessor.Send(packet); } public void Receive(PacketHandlerBase handler) { handler.Context = this.Context; handler.Handle(); } } } 


TcpClient рдФрд░ рд╣реИрдВрдбрд▓рд░ рд╕реНрдЯреЛрд░реЗрдЬ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд░рди рд╡рд┐рдзрд┐ рдкреИрдХреЗрдЯ рдзрд╛рд░рд╛рдУрдВ рдХреЛ рдкрдврд╝рдирд╛ рдФрд░ рднреЗрдЬрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддреА рд╣реИред рднреЗрдЬреЗрдВ рд╡рд┐рдзрд┐ рдПрдХ рдкреИрдХреЗрдЯ рднреЗрдЬрддрд╛ рд╣реИред рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рд╡рд┐рдзрд┐ рдореЗрдВ, рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВрдбрд▓рд░ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб


рдЧреНрд░рд╛рд╣рдХ рдХрд╛ рд╕рдВрджрд░реНрдн



рдХрдиреЗрдХреНрд╢рди рд╡рд░реНрдЧ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рд╕рд░реНрд╡рд░ рддрдХ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред рд╣реИрдВрдбрд▓рд░ рдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рдВрджрд░реНрдн рдХреНрд╖реЗрддреНрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдЙрджрд╛рд╣рд░рдг рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП ClientContext рд╡рд░реНрдЧред

 namespace Server { class ClientContext { public ClientContext(Connection connection) { this.Connection = connection; } public Connection Connection { get; set; } } } 


ClientContextFactory



ClientContextFactory рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдиреЗрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдирдпрд╛ ClientContext рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 namespace Server { class ClientContextFactory : ContextFactory { public override object MakeContext(Connection connection) { return new ClientContext(connection); } } } 


рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рдВрд╕реНрдХрд░рдг рд╡рд░реНрдЧ



ServerHandlersV1 рд╣реИрдВрдбрд▓рд░ рд╕реНрдЯреЛрд░ рд╡рд╛рд░рд┐рд╕ред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдкреИрдХреЗрдЯ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ PacketHandlerStorage рдХреЗ рдмрдЬрд╛рдп рдЖрд╡рд╢реНрдпрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╡рд░реНрдЧ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 namespace Server { class ServerHandlersV1 : PacketHandlerStorage { public ServerHandlersV1() { //AddHandler(0, new SomePacketHandler1()); //AddHandler(1, new SomePacketHandler2()); } } } 


рд╕рд░реНрд╡рд░



 namespace Server { class Server { public Server(int port, ContextFactory contextFactory) { this.Port = port; this.Started = false; this._contextFactory = contextFactory; this._connectios = new List(); } private Thread _newThread; private TcpListener _listner; private List _connectios; //  public int Port { get; set; } public bool Started { get; private set; } public PacketHandlerStorage Handlers { get; set; } //  private ContextFactory _contextFactory { get; set; } private void _worker() { this._listner = new TcpListener(IPAddress.Any, this.Port); this._listner.Start(); this.Started = true; while (this.Started) { TcpClient client = this._listner.AcceptTcpClient(); Connection connection = new Connection(client, this.Handlers); connection.Context = this._contextFactory.MakeContext(connection); connection.Run(); this._connectios.Add(connection); } } public void Run() { this._newThread = new Thread(this._worker); this._newThread.Start(); } } } 


рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкреЛрд░реНрдЯ рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред _рд╡рд░реНрдХрд░ рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо tcpListner рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд▓реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрдиреЗрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдЙрд╕рдХреЗ рд╕рдВрджрд░реНрдн рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдХрдиреЗрдХреНрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рд░рди рд╡рд┐рдзрд┐ рдПрдХ рдереНрд░реЗрдб рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ _worker рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИред

рдЧреНрд░рд╛рд╣рдХ рднрд╛рдЧ


рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рдВрд╕реНрдХрд░рдг рд╡рд░реНрдЧ



рд╣реИрдВрдбрд▓рд░ рд╕реНрдЯреЛрд░ рдХрд╛ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА ClientHandlersV1 рд╣реИред

 namespace Client { class ClientHandlersV1 : PacketHandlerStorage { public ClientHandlersV1() { //AddHandler(0, new SomePacketHandler1()); //AddHandler(1, new SomePacketHandler2()); } } } 


рдЧреНрд░рд╛рд╣рдХ



 namespace Client { class Client { public Client(string ip, int port, PacketHandlerStorage handlers) { this._tcpClient = new TcpClient(ip, port); this._connection = new Connection(this._tcpClient, handlers); this._connection.Context = this; this._connection.Run(); } private TcpClient _tcpClient; private Connection _connection; } } 


рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЖрдИрдкреА, рдкреЛрд░реНрдЯ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг


рд╕рд┐рдВрдкрд▓ рдХрдВрд╕реЛрд▓ рдЪреИрдЯред

рд╕рд░реНрд╡рд░



 namespace Chat_server { class Program { public static Server.Server Server { get; set; } //  public static List<string> Contacts { get; set; } //    static void Main(string[] args) { Contacts = new List<string>(); Server = new Server.Server(1698, new Server.ClientContextFactory(), new Server.ServerHandlersV1()); Server.Run(); DateTime now = new DateTime(); now = DateTime.Now; System.Console.WriteLine("Server started at " + now.Hour + ":" + now.Minute + ":" + now.Second); } } } 


рд╕реНрд╡рд╛рдЧрдд рдкреИрдХреЗрдЬ:

 using Common; namespace Server.Packets { class HelloPacket : PacketBase { public HelloPacket() : base(0) {} //id - 0 } } 


рд╕рдВрджреЗрд╢ рдкреИрдХреЗрдЬ:

 using Common; namespace Server.Packets { class MessagePacket : PacketBase { public MessagePacket(string nick, string message) : base(1) { this._nick = nick; this._message = message; } private string _nick; private string _message; protected override void WriteBody(System.IO.BinaryWriter writer) { writer.Write(this._nick); writer.Write(this._message); } } } 


WriteBody рд╡рд┐рдзрд┐ рдкреИрдХреЗрдЬ рдмреЙрдбреА рдХреЛ рднреЗрдЬрддреА рд╣реИ рдпрд╛рдиреА рдкреНрд░реЗрд╖рдХ рдХрд╛ рдЙрдкрдирд╛рдо рдФрд░ рдЙрд╕рдХрд╛ рд╕рдВрджреЗрд╢ред

рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ рдкреИрдХреЗрдЯ рд╣реИрдВрдбрд▓рд░:

 using Common; using Chat_server; using System; namespace Server.PacketHandlers { class HelloPacketHandler : PacketHandlerBase { public HelloPacketHandler() { } private string _nick; public override void Read() { this._nick = this.Reader.ReadString(); //  } public override void Handle() { Program.Contacts.Add(this._nick); //   DateTime now = new DateTime(); now = DateTime.Now; System.Console.WriteLine(now.Hour + ":" + now.Minute + ":" + now.Second + " " + this._nick + " connected"); } public override object Clone() { return new HelloPacketHandler(); } } } 


рд╕реНрд╡рд╛рдЧрдд рдкреИрдХреЗрдЯ рдореЗрдВ, рдЧреНрд░рд╛рд╣рдХ рд╣рдореЗрдВ рдПрдХ рдЙрдкрдирд╛рдо рднреЗрдЬрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд░реАрдб рд╡рд┐рдзрд┐ рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣реИрдВрдбрд▓ рд╡рд┐рдзрд┐ рдореЗрдВ рдЗрд╕реЗ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде:

 using Common; using Server; using Server.Packets; using Chat_server; namespace Server.PacketHandlers { class MessagePacketHandler : PacketHandlerBase { public MessagePacketHandler() { } private string _nick; private string _message; public override void Read() { this._nick = this.Reader.ReadString(); //  this._message = this.Reader.ReadString(); //  } public override void Handle() { Program.Server.SendMessage(this._nick, this._message, ((ClientContext)Context).Connection); //     } public override object Clone() { return new MessagePacketHandler(); } } } 


рдЙрдкрдирд╛рдо рдФрд░ рд╕рдВрджреЗрд╢ рдкрдврд╝реЗрдВ рд╡рд┐рдзрд┐ рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЗрд╡рд▓ рдЗрд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдПрдХ рдкреИрдХреЗрдЯ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕рд░реНрд╡рд░ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рд▓рд┐рдЦреА рд╣реИ рдЬреЛ рднреЗрдЬреЗ рдЧрдП рд╕рдВрджреЗрд╢ рдХреЛ рд╕рднреА рдХрдиреЗрдХреНрдЯреЗрдб рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рднреЗрдЬрддреА рд╣реИред

 public void SendMessage(string nick, string message, Connection sender) { foreach (Connection connection in this._connectios) if(connection != sender) connection.Send(new MessagePacket(nick, message)); } 


ServerHandlersV1 рд╡рд░реНрдЧ (рдкреИрдХреЗрдЯреЗрдЯреИрдВрдбрд▓рд░рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рд╡рдВрд╢рдЬ) рдореЗрдВ рд╣реИрдВрдбрд▓рд░ред

 using Common; using Server.PacketHandlers; namespace Server { class ServerHandlersV1 : PacketHandlerStorage { public ServerHandlersV1() { AddHandler(0, new HelloPacketHandler()); AddHandler(1, new MessagePacketHandler()); } } } 


рдЧреНрд░рд╛рд╣рдХ



 namespace Chat_client { class Program { public static Client.Client Client { get; set; } //  public static string Nick { get; set; } // public static string IpAddress { get; set; } //Ip  static void Main(string[] args) { string message; Console.Write(" : "); Nick = Console.ReadLine(); Console.Write("IP  : "); IpAddress = Console.ReadLine(); Console.Clear(); Client = new Client.Client(IpAddress, 1698, new Client.ClientHandlersV1()); while (true) { message = Console.ReadLine(); Client.SendMessagePacket(message); } } } } 


рд▓реВрдк рдбрд╛рдпрд▓ рдХрд┐рдП рдЧрдП рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдкреИрдХреЗрдЬ рднреЗрдЬрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ; рдореИрдВрдиреЗ рдЧреНрд░рд╛рд╣рдХ рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рд▓рд┐рдЦреА рд╣реИред

 public void SendMessagePacket(string message) { this._connection.Send(new MessagePacket(Program.Nick, message)); } 


рд╕реНрд╡рд╛рдЧрдд рдкреИрдХреЗрдЬ:

 using Common; using Chat_client; namespace Client.Packets { class HelloPacket : PacketBase { public HelloPacket() : base(0) {} //id - 0 protected override void WriteBody(System.IO.BinaryWriter writer) { writer.Write(Program.Nick); } } } 


рдЙрдкрдирд╛рдо WriteBody рдкрджреНрдзрддрд┐ рдореЗрдВ рднреЗрдЬрд╛ рдЧрдпрд╛ рд╣реИред

рд╕рдВрджреЗрд╢ рдкреИрдХреЗрдЬ:

 using Common; namespace Client.Packets { class MessagePacket : PacketBase { public MessagePacket(string nick, string message) : base(1) { this._nick = nick; this._message = message; } private string _nick; private string _message; protected override void WriteBody(System.IO.BinaryWriter writer) { writer.Write(this._nick); writer.Write(this._message); } } } 


рдЖрдкрдХрд╛ рдЙрдкрдирд╛рдо рдФрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ рдкреИрдХреЗрдЯ рд╣реИрдВрдбрд▓рд░:

 using Common; namespace Client.PacketHandlers { class HelloPacketHandler : PacketHandlerBase { public HelloPacketHandler() { } public override object Clone() { return new HelloPacketHandler(); } } } 


рд╡рд╣ рдХреЛрдИ рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╕рдВрджреЗрд╢ рдмреИрдЪ рд╣реИрдВрдбрд▓рд░:

 using Common; namespace Client.PacketHandlers { class MessagePacketHandler : PacketHandlerBase { public MessagePacketHandler() { } private string _nick; private string _message; public override void Read() { this._nick = this.Reader.ReadString(); //  this._message = this.Reader.ReadString(); //  } public override void Handle() { System.Console.ForegroundColor = System.ConsoleColor.Green; System.Console.Write(this._nick + ": "); System.Console.ForegroundColor = System.ConsoleColor.Gray; System.Console.WriteLine(this._message); } public override object Clone() { return new MessagePacketHandler(); } } } 


рд░реАрдб рд╡рд┐рдзрд┐ рдореЗрдВ, рдЙрдкрдирд╛рдо рдФрд░ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рд╣реИрдВрдбрд▓ рд╡рд┐рдзрд┐ рдореЗрдВ, рд╕рдВрджреЗрд╢ рдХрдВрд╕реЛрд▓ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред

ClientHandlersV1 рдореЗрдВ рд╣реИрдВрдбрд▓рд░ред

 using Common; using Client.PacketHandlers; namespace Client { class ClientHandlersV1 : PacketHandlerStorage { public ClientHandlersV1() { AddHandler(0, new HelloPacketHandler()); AddHandler(1, new MessagePacketHandler()); } } } 


рд╕рд░рд▓ рдорд▓реНрдЯреА-рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдВрд╕реЛрд▓ рдЪреИрдЯ рддреИрдпрд╛рд░ рд╣реИ!

рдЫрд╡рд┐
рдЫрд╡рд┐

рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ

рдЪреИрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ (рд╕рд░реНрд╡рд░)

рдЪреИрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ (рдЧреНрд░рд╛рд╣рдХ)

Source: https://habr.com/ru/post/In142819/


All Articles