рдЯреАрд╕реА рдмрд╛рдЗрдХ рд╕реА # рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ - рдЕрдкрдиреА рдмрд╛рдЗрдХ





рдирдорд╕реНрддреЗ!



рдореИрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдкреЛрд╕реНрдЯреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛, рдЗрд╕ рдмрд╛рд░ рдореИрдВ рдиреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдмреАрдЪ рдЯреАрд╕реАрдкреА рдХрдиреЗрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рд╕рдВрдЪрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрд╣ рдЖрд▓реЗрдЦ рд╢реБрд░реБрдЖрддреА рдпрд╛ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЕрднреА рддрдХ .Net рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдПрдХ рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЙрджрд╛рд╣рд░рдг рд╕рдВрд▓рдЧреНрди рд╣реИ: http://yadi.sk/d/1OxmAFuCN3kmc ред



рдХрдЯ рдХреЗ рддрд╣рдд рд╡рд┐рд╡рд░рдгред



рдЗрд╕ рд▓реЗрдЦ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?


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



рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдмрд┐рдЯ


рдиреЗрдЯрд╡рд░реНрдХ рдХрдиреЗрдХреНрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░реАрдо рд╣реИ, рдЬрд╣рд╛рдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдмрд╛рдЗрдЯреНрд╕ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рд╕рд░реНрд╡рд░ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред

рддрджрдиреБрд╕рд╛рд░, рдЖрджреЗрд╢реЛрдВ рдХреЗ рдПрдХ рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрд┐рд╕реЗ рдкреНрд░рд╕рд╛рд░рдг рдкрдХреНрд╖ рдкрд░ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдкреНрд░рд╛рдкреНрдд рдкрдХреНрд╖ рдкрд░ deserialized рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред



рдореЗрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рдХрдорд╛рдВрдб рджреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, "рдЯреЛрдмрд╛рдЗрдЯреНрд╕" рдФрд░ "рдлреНрд░реЙрдо рдмрд╛рдпрдмрд╛рдЗрдЯреНрд╕", рд╕рд╛рде рд╣реА рд╕рд╛рде рдЧреБрдгреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдЬреЛ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрдХреНрд╖ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

SingleCommand
public class SingleCommand: BaseCommand { public int IntField { get; set; } public decimal DecimalField { get; set; } //     public override byte[] ToBytes() { //   const int messageLenght = sizeof(int) + sizeof(decimal); //        var messageData = new byte[messageLenght]; using (var stream = new MemoryStream(messageData)) { //     var writer = new BinaryWriter(stream); writer.Write(IntField); writer.Write(DecimalField); return messageData; } } //    ,             public static SingleCommand FromBytes(byte[] bytes) { using (var ms = new MemoryStream(bytes)) { var br = new BinaryReader(ms); var command = new SingleCommand(); command.IntField = br.ReadInt32(); command.DecimalField = br.ReadDecimal(); return command; } } }
      
      







рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рдЪрд░-рд▓рдВрдмрд╛рдИ рд╕рдВрдкрддреНрддрд┐ рд╡рд╛рд▓реА рдПрдХ рдХрдорд╛рдВрдб рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдЗрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ рдХреЛ рдЧреБрдгреЛрдВ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

StringCommand
 public class StringCommand : BaseCommand { //   private int StringFieldLenght { get; set; } // public string StringField { get; set; } public override byte[] ToBytes() { //     byte[] stringFieldBytes = CommandUtils.GetBytes(StringField); // -   StringFieldLenght = stringFieldBytes.Length; //     int messageLenght = sizeof(int) + StringFieldLenght; var messageData = new byte[messageLenght]; using (var stream = new MemoryStream(messageData)) { var writer = new BinaryWriter(stream); //     writer.Write(StringFieldLenght); //   writer.Write(stringFieldBytes); return messageData; } } public static StringCommand FromBytes(byte[] bytes) { using (var ms = new MemoryStream(bytes)) { var br = new BinaryReader(ms); var command = new StringCommand(); //     command.StringFieldLenght = br.ReadInt32(); //          command.StringField = CommandUtils.GetString(br.ReadBytes(command.StringFieldLenght)); return command; } } }
      
      







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

CommandHeader
 public struct CommandHeader { //  ,   CommandTypeEnum public int Type { get; set; } //   public int Count { get; set; } public static int GetLenght() { return sizeof(int) * 2; } public static CommandHeader FromBytes(byte[] bytes) { using (var ms = new MemoryStream(bytes)) { var br = new BinaryReader(ms); var currentObject = new CommandHeader(); currentObject.Type = br.ReadInt32(); currentObject.Count = br.ReadInt32(); return currentObject; } } public byte[] ToBytes() { var data = new byte[GetLenght()]; using (var stream = new MemoryStream(data)) { var writer = new BinaryWriter(stream); writer.Write(Type); writer.Write(Count); return data; } } }
      
      







рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдХрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдирд┐рдореНрди рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣реЛрддрд╛ рд╣реИ:

1. рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИред

2. рдПрдХ рдХрдорд╛рдВрдб рднреЗрдЬрддрд╛ рд╣реИ

3. рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред

4. рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред

5. рдпрджрд┐ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдЖрдИ, рддреЛ рдЗрд╕реЗ рдЯрд╛рдЗрдордЖрдЙрдЯ рджреНрд╡рд╛рд░рд╛ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред



рд╕рд░реНрд╡рд░ рдХреЛ рдХрдорд╛рдВрдб рднреЗрдЬрдирд╛:

рд╕рд░реНрд╡рд░ рдкрд░ рдХрдорд╛рдВрдб рднреЗрдЬрдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛
 //     var stringCommand = new StringCommand { StringField = stringCommandTextBox.Text }; //    CommandSender.SendCommandToServer("127.0.0.1", stringCommand, CommandTypeEnum.StringCommand);
      
      







рднреЗрдЬреЗрдВ рд╕рд░реНрд╡рд░ рдХрдорд╛рдВрдб рд╡рд┐рдзрд┐ рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ
 public static void SendCommandToServer(string serverIp, BaseCommand command, CommandTypeEnum typeEnum) { //  ,      var commandHeader = new CommandHeader { Count = 1, Type = (int)typeEnum }; //     byte[] commandBytes = CommandUtils.ConcatByteArrays(commandHeader.ToBytes(), command.ToBytes()); //   SendCommandToServer(serverIp, Settings.Port, commandBytes); } private static void SendCommandToServer(string ipAddress, int port, byte[] messageBytes) { var client = new TcpClient(); try { client.Connect(ipAddress, port); // 4      byte[] messageBytesWithEof = CommandUtils.AddCommandLength(messageBytes); NetworkStream networkStream = client.GetStream(); networkStream.Write(messageBytesWithEof, 0, messageBytesWithEof.Length); //      MessageHandler.HandleClientMessage(client); } catch (SocketException exception) { Trace.WriteLine(exception.Message + " " + exception.InnerException); } }
      
      







рд╕рд░реНрд╡рд░ рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдХрдорд╛рдВрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
 public class CommandListener { private readonly TcpListener _tcpListener; private Thread _listenThread; private bool _continueListen = true; public CommandListener() { //      _tcpListener = new TcpListener(IPAddress.Any, Settings.Port); } public void Start() { //      _listenThread = new Thread(ListenForClients); _listenThread.Start(); } private void ListenForClients() { _tcpListener.Start(); while (_continueListen) { TcpClient client = _tcpListener.AcceptTcpClient(); //        var clientThread = new Thread(HandleClientCommand); clientThread.Start(client); } _tcpListener.Stop(); } private void HandleClientCommand(object client) { //  MessageHandler.HandleClientMessage(client); } public void Stop() { _continueListen = false; _tcpListener.Stop(); _listenThread.Abort(); } }
      
      







рд╕рдВрд╕рд╛рдзрди рдкреНрд░рд╛рдкреНрдд рдЖрджреЗрд╢:
 public static void HandleClientMessage(object client) { var tcpClient = (TcpClient)client; //     tcpClient.ReceiveTimeout = 3; //  NetworkStream clientStream = tcpClient.GetStream(); var ms = new MemoryStream(); var binaryWriter = new BinaryWriter(ms); var message = new byte[tcpClient.ReceiveBufferSize]; var messageLenght = new byte[4]; int readCount; int totalReadMessageBytes = 0; //    clientStream.Read(messageLenght, 0, 4); //    int messageLength = CommandUtils.BytesToInt(messageLenght); //          while ((readCount = clientStream.Read(message, 0, tcpClient.ReceiveBufferSize)) != 0) { binaryWriter.Write(message, 0, readCount); totalReadMessageBytes += readCount; if (totalReadMessageBytes >= messageLength) break; } if (ms.Length > 0) { //   Parse(ms.ToArray(), tcpClient); } } private static void Parse(byte[] bytes, TcpClient tcpClient) { if (bytes.Length >= CommandHeader.GetLenght()) { CommandHeader commandHeader = CommandHeader.FromBytes(bytes); IEnumerable<byte> nextCommandBytes = bytes.Skip(CommandHeader.GetLenght()); var commandTypeEnum = (CommandTypeEnum)commandHeader.Type; if (commandTypeEnum == CommandTypeEnum.MessageAccepted) { if (OnMessageAccepted != null) OnMessageAccepted(); } else { BaseCommand baseCommand = BytesToCommands[commandTypeEnum].Invoke(nextCommandBytes.ToArray()); switch (commandTypeEnum) { case CommandTypeEnum.StringCommand: if (OnStringCommand != null) OnStringCommand((StringCommand)baseCommand, tcpClient); break; case CommandTypeEnum.SingleCommand: if (OnSingleCommand != null) OnSingleCommand((SingleCommand)baseCommand, tcpClient); break; case CommandTypeEnum.FileCommand: if (OnSingleCommand != null) OnFileCommand((FileCommand)baseCommand, tcpClient); break; case CommandTypeEnum.SaveUserCommand: if (OnSingleCommand != null) OnSaveUserCommand((SaveUserCommand)baseCommand, tcpClient); break; } } } }
      
      







рдЬрд╛рд╡рд╛ рдмрд╛рддрдЪреАрдд


рдЖрджреЗрд╢ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рди рдЧреБрдЬрд░рддрд╛ рд╣реИ

рдЯреАрдо
 package com.offviewclient.network.commands; import java.io.*; public class IntCommand implements Serializable { public int IntNumber; public static int GetLenght() { return 4 ; } public static IntCommand FromBytes(byte[] bytes) throws IOException { ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes); DataInputStream ois = new DataInputStream(inputStream); IntCommand commandType = new IntCommand(); commandType.IntNumber = ois.readInt(); return commandType; } public byte[] ToBytes() throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream oos = new DataOutputStream (bos); oos.writeInt(this.IntNumber); byte[] yourBytes = bos.toByteArray(); oos.close(); bos.close(); return yourBytes; } }
      
      







рдХрдорд╛рдВрдб рднреЗрдЬрдирд╛ рдФрд░ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ (рд╡рд░реНрдХрд┐рдВрдЧ рдбреНрд░рд╛рдлреНрдЯ рд╕реЗ рдХреЛрдб):
  private void SendPacket(byte[] packetBytes) throws IOException { byte[] packetBytesWithEOF = CommandUtils.AddCommandLength(packetBytes); Socket socket = new Socket(serverIP, port); socket.setSoTimeout(5000); OutputStream socketOutputStream = socket.getOutputStream(); socketOutputStream.write(packetBytesWithEOF); byte[] answerBytes = ReadAnswerBytes(socket); socket.close(); Parse(answerBytes); } private byte[] ReadAnswerBytes(Socket socket) throws IOException { InputStream out = socket.getInputStream(); DataInputStream dis = new DataInputStream(out); ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream binaryWriter = new DataOutputStream (bos); int readCount; byte[] message = new byte[10000]; byte[] messageLength = new byte[4]; dis.read(messageLength , 0, 4); int messageLength = CommandUtils.BytesToInt(messageLength); int totalReadMessageBytes = 0; while ((readCount = dis.read(message, 0, 10000)) != 0) { binaryWriter.write(message, 0, readCount); totalReadMessageBytes += readCount; if(totalReadMessageBytes >= messageLength) break; } return bos.toByteArray(); } private void Parse(byte[] messageBytes) throws IOException { if (messageBytes.length >= CommandHeader.GetLenght()) { CommandHeader commandType = CommandHeader.FromBytes(messageBytes); int skipBytes = commandType.GetLenght(); if(commandType.Type == CommandTypeEnum.MESSAGE_ACCEPTED) { RiseMessageAccepted(); } if(commandType.Type == CommandTypeEnum.SLIDE_PAGE_BYTES) { List<byte[]> drawableList = new Vector<byte[]>(); for(int i = 0; i< commandType.Count; i++) { PresentationSlideCommand presentationSlideCommand = PresentationSlideCommand.FromBytes(messageBytes, skipBytes); drawableList.add(presentationSlideCommand.FileBytes); skipBytes += presentationSlideCommand.GetLenght(); } RiseMessageAcceptSlideEvent(drawableList); } } }
      
      







рдЬрд╛рд╡рд╛ рдФрд░ .Net рдХреА рдмрд╛рддрдЪреАрдд рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ: .Net рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдкреНрд░рд╛рдердорд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИ, рдЗрд╕рд▓рд┐рдП, .Net рдкрдХреНрд╖ рдкрд░, рд╕рднреА рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рдиреЛрдВ рдХреЛ IPAddress.HostTrNetworkOrder рд╡рд┐рдзрд┐ рд╕реЗ рдХреЙрд▓ рдХрд░рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:



рдХреЗ рдЙрдкрдпреЛрдЧ


рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХреЛ рд╕рд┐рдЦрд╛рдПрдВрдЧреЗред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдореЗрдВ рдкрд╣рд▓рд╛ рдФрд░ рдЕрдВрддрд┐рдо рдирд╛рдо рд╣реЛрдЧрд╛ред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП:

1. рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдореЗрдВ рдПрдХ рдирдИ рдЯреАрдо рдЬреЛрдбрд╝реЗрдВ

 public enum CommandTypeEnum : int { StringCommand = 1, MessageAccepted = 2, SingleCommand = 3, FileCommand = 4, SaveUserCommand = 5 //     }
      
      





2. рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдкреНрд░реЗрд╖рд┐рдд рдбреЗрдЯрд╛ рдЬреЛрдбрд╝реЗрдВ:

 public class SaveUserCommand : BaseCommand { private int FirstNameLenght { get; set; } public string FirstName { get; set; } //  private int SecondNameLenght { get; set; } public string SecondName { get; set; } // public override byte[] ToBytes() { byte[] firstNamebytes = CommandUtils.GetBytes(FirstName); FirstNameLenght = firstNamebytes.Length; byte[] secondNamebytes = CommandUtils.GetBytes(SecondName); SecondNameLenght = secondNamebytes.Length; int messageLenght = sizeof(int) * 2 + FirstNameLenght + SecondNameLenght; //   var messageData = new byte[messageLenght]; using (var stream = new MemoryStream(messageData)) { var writer = new BinaryWriter(stream); writer.Write(FirstNameLenght); writer.Write(firstNamebytes); writer.Write(SecondNameLenght); writer.Write(secondNamebytes); return messageData; } } public static SaveUserCommand FromBytes(byte[] bytes) { using (var ms = new MemoryStream(bytes)) { var br = new BinaryReader(ms); var command = new SaveUserCommand(); command.FirstNameLenght = br.ReadInt32(); command.FirstName = CommandUtils.GetString(br.ReadBytes(command.FirstNameLenght)); command.SecondNameLenght = br.ReadInt32(); command.SecondName = CommandUtils.GetString(br.ReadBytes(command.SecondNameLenght)); return command; } } }
      
      





3. рдПрдХ рдирдП рдорд╛рдорд▓реЗ рдХреЗ рд╕рд╛рде MessageHandler рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред

 case CommandTypeEnum.SaveUserCommand: if (OnSingleCommand != null) OnSaveUserCommand((SaveUserCommand)baseCommand, tcpClient); break;
      
      





4. рдЕрдиреБрдкреВрд░рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рдорд╛рдирдЪрд┐рддреНрд░рдг рдХреЗ рд╕рд╛рде рдЕрдиреБрдкреВрд░рдХ рд╕рдВрджреЗрд╢рд╣реИрдВрдбрд▓рд░

 private static void FillBytesToCommandsDictionary() { BytesToCommands.Add(CommandTypeEnum.StringCommand, StringCommand.FromBytes); BytesToCommands.Add(CommandTypeEnum.SingleCommand, SingleCommand.FromBytes); BytesToCommands.Add(CommandTypeEnum.FileCommand, FileCommand.FromBytes); BytesToCommands.Add(CommandTypeEnum.SaveUserCommand, SaveUserCommand.FromBytes); }
      
      





5. рд╣рдо рдЧреНрд░рд╛рд╣рдХ рдкрдХреНрд╖ рдкрд░ рдПрдХ рдирдпрд╛ рдЖрджреЗрд╢ рднреЗрдЬрддреЗ рд╣реИрдВ:

 var saveUserCommand = new SaveUserCommand { FirstName = firstNameTextBox.Text, SecondName = secondNameTextBox.Text }; CommandSender.SendCommandToServer(serverIpTextBox.Text, saveUserCommand, CommandTypeEnum.SaveUserCommand);
      
      





6. рд╕рд░реНрд╡рд░ рдХреА рдУрд░ рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ:

 MessageHandler.OnSaveUserCommand += CommandListener_OnSaveUserCommand; private static void CommandListener_OnSaveUserCommand(SaveUserCommand saveUserCommand, TcpClient tcpClient) { Console.WriteLine("SaveUserCommand accepted, FirstName:{0}, SecondName:{1}", saveUserCommand.FirstName, saveUserCommand.SecondName); CommandSender.SendMessageAcceptedToClient(tcpClient); }
      
      







рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдпреИрдВрдбреЗрдХреНрд╕ рдбреНрд░рд╛рдЗрд╡ рдкрд░ рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ: http://yadi.sk/d/1OxmAFuCN3kmc ред

рдЖрдк рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж!



All Articles