/// <summary> /// Отправляет запрос на сервер /// </summary> /// <param name="operType">Тип операции</param> /// <param name="oper">Объект операции</param> public void SendRequest(OpearationTypes operType, IOperation oper) { LogService.Trace($"Клиент отправляет {operType}"); try { string bodyJson; if (operType == OpearationTypes.ShipArrangement) { var arr = (ShipArrangement)oper; bodyJson = CryptSystem.ArrangementToByte(arr.Arragment); } else { // Сериализуем тело ответа в строку Json bodyJson = oper != null?JsonConvert.SerializeObject(oper) : ""; } JsonData jsonData = new JsonData(operType, bodyJson); // Сериализуем объект ответа в строку Json string outData = JsonConvert.SerializeObject(jsonData); // Отправляем данные клиенту byte[] sendBytes = Encoding.UTF8.GetBytes(outData); _networkStream.Write(sendBytes, 0, sendBytes.Length); LogService.Trace($"Отправлено: {outData}"); } catch (Exception e) { LogService.Trace($"Не удалось отправить: {e.Message}"); } }
/// <summary> /// Преобразовывает Json в объект /// </summary> /// <param name="operType">Тип операции</param> /// <param name="jsonData">Json операции</param> /// <returns></returns> public static Tuple <OpearationTypes, IOperation> GetObjectByJson(OpearationTypes operType, string jsonData) { IOperation result = null; OpearationTypes resOperType = operType; try { switch (operType) { case OpearationTypes.Shot: result = JsonConvert.DeserializeObject <Shot>(jsonData); break; case OpearationTypes.ShotResult: result = JsonConvert.DeserializeObject <ShotResult>(jsonData); break; case OpearationTypes.GameStatus: result = JsonConvert.DeserializeObject <GameStatus>(jsonData); break; case OpearationTypes.StartConfig: result = JsonConvert.DeserializeObject <StartConfig>(jsonData); break; case OpearationTypes.ShipArrangement: result = new ShipArrangement(CryptSystem.ByteToArrangement(jsonData)); break; case OpearationTypes.Error: break; case OpearationTypes.SwitchTurn: break; default: throw new ArgumentOutOfRangeException(); } LogService.Trace($"Запрос {operType} принят"); } catch (ArgumentOutOfRangeException e) { resOperType = OpearationTypes.Error; LogService.Trace($"Указана неверная операция: {e.Message}"); } catch (Exception e) { throw new Exception(e.Message); } return(Tuple.Create(resOperType, result)); }
/// <summary> /// Возвращает IP-адрес по его текстовому представлению. /// </summary> /// <param name="address">Текстовое представление IP-адреса.</param> /// <returns></returns> public static IPAddress StringToIP(string address) { byte[] tmp = new byte[6]; for (int i = 0; i < 6; i++) { tmp[i] = CryptSystem.HexToByte(address[2 * i].ToString() + address[2 * i + 1]); } byte[] ip = new byte[4]; byte[] hash = new byte[2] { tmp[4], tmp[5] }; for (int i = 0; i < 4; i++) { ip[i] = tmp[i]; } ip = CryptSystem.UnVigenere(ip, hash); IPAddress res = new IPAddress(ip); return(res); }
/// <summary> /// Возвращает текстовое представление IP-адреса. /// </summary> /// <param name="address">IP-адрес.</param> /// <returns></returns> public static string IPToString(IPAddress address) { byte[] ip = address.GetAddressBytes(); byte[] hash = CryptSystem.GetHash(ip); ip = CryptSystem.Vigenere(ip, hash); byte[] tmp = new byte[6]; for (int i = 0; i < 4; i++) { tmp[i] = ip[i]; } tmp[4] = hash[0]; tmp[5] = hash[1]; string res = ""; for (int i = 0; i < tmp.Length; i++) { res += CryptSystem.ByteToHex(tmp[i]); } return(res); }