MessagesPack GetInboxMessages(string currentUsername, MessageTypes messageTypes, Byte[] recentVersion) { List <Message> recievedMessages = new List <Message>(); Message result; bool deleted = messageTypes.HasFlag(MessageTypes.Deleted); bool viewed = messageTypes.HasFlag(MessageTypes.Viewed); ///Ищем в получателях List <Recipient> recipients = RecipientGateway.Select(currentUsername, currentUsername, deleted, viewed); foreach (Recipient item in recipients) { result = MessageGateway.Select((int)item.MessageId, currentUsername); recievedMessages.Add(result); } MessagesPack messagesPack = new MessagesPack(); //Сумма Id всех полученных сообщений messagesPack.CountInDB = recievedMessages.Count(); ///Сообщения с версией выше чем у клиента messagesPack.Messages = GetRecentVersionMessages(recievedMessages, recentVersion); ///Звполнить Sender, Recipients foreach (Message item in messagesPack.Messages) { FillMessage(item, currentUsername); } return(messagesPack); }
public void Send(byte[] serializedContainer, IPEndPoint endPoint) { Console.WriteLine("Отправка контейнера размером " + serializedContainer.Length + "\n\n\n\n"); MessagesPack container = ZeroFormatterSerializer .Deserialize <MessagesPack>(serializedContainer); if (container.Messages == null) { throw new Exception("Пустой контейнер"); } containers.Add(container); }
MessagesPack GetSentboxMessages(string currentUsername, MessageTypes messageTypes, Byte[] recentVersion) { bool deleted = messageTypes.HasFlag(MessageTypes.Deleted); List <Message> sentMessages = MessageGateway.Select(currentUsername, currentUsername, deleted); MessagesPack messagesPack = new MessagesPack(); messagesPack.CountInDB = sentMessages.Count(); messagesPack.Messages = GetRecentVersionMessages(sentMessages, recentVersion); foreach (Message item in messagesPack.Messages) { FillMessage(item, currentUsername); } return(messagesPack); }
protected void UpdateMessages(FolderType folderType, MessageTypes messageTypes, List <Message> messages) { List <Entity> entities = new List <Entity>(); entities.AddRange(messages); byte[] recentVersion = AdditionalTools.GetMaxTimestamp(entities); MessagesPack pack = App.proxy.GetMessages(folderType, messageTypes, recentVersion); List <Message> messagesBuf = new List <Message>(); messagesBuf.AddRange(messages); if (!UpdateMessagesByPack(pack, messagesBuf)) { TrimMessages(messagesBuf, folderType, messageTypes); } UploadFromMessagesBuf(messages, messagesBuf); }
public void HandleBytes(byte[] datagram) { //Для отладки на компьютере специально пропуская пакеты #if UNITY_EDITOR if (packetLossEvent.IsEventHappened()) { return; } #endif MessagesPack messagesContainer = ZeroFormatterSerializer.Deserialize <MessagesPack>(datagram); NetworkStatisticsStorage.Instance.RegisterDatagram(datagram.Length, messagesContainer.Id); foreach (byte[] data in messagesContainer.Messages) { MessageWrapper message = ZeroFormatterSerializer.Deserialize <MessageWrapper>(data); NetworkStatisticsStorage.Instance.RegisterMessage(data.Length, message.MessageType); messageProcessor.Handle(message); } }
private void SendDatagram(IPEndPoint ipEndPoint, List <byte[]> messages, int startMessageIndex, int messagesCount, int packId) { if (messagesCount == 0) { throw new Exception("Нельзя отправлять пустые контейнеры"); } //Положить сообщения в контейнер MessagesPack messagesPack = new MessagesPack(); messagesPack.Messages = new byte[messagesCount][]; messages.CopyTo(startMessageIndex, messagesPack.Messages, 0, messagesCount); //Установить номер контейнера для игрока messagesPack.Id = packId; //Сериализовать контейнер byte[] serializedDatagram = ZeroFormatterSerializer.Serialize(messagesPack); //Отправить контейнер udpSender.Send(serializedDatagram, ipEndPoint); }
bool UpdateMessagesByPack(MessagesPack pack, List <Message> messagesBuf) { if (pack.Messages.Count > 0) { Message message; foreach (Message item in pack.Messages) { message = messagesBuf.FirstOrDefault(row => row.Id == item.Id); if (message == null) { messagesBuf.Add(item); } else { messagesBuf.Remove(message); messagesBuf.Add(item); } } /// Восстанавливаем нормальный порядок messagesBuf = messagesBuf.OrderBy(row => row.Date).ToList(); } return(messagesBuf.Count == pack.CountInDB); }
public void Connect(string Port, string IP, string Id, string Name, string Password, Color color, bool IsNewUser) { if (Connected) { return; } bool validPort = int.TryParse(Port, out _port); bool validIP = IPAddress.TryParse(IP, out _ip); bool validName = Name != null; bool EmptyPassword = string.IsNullOrWhiteSpace(Password); bool EmptyId = string.IsNullOrWhiteSpace(Id); if (validIP == false && validPort == true) { throw new SpecialException('A'); } else if (validPort == false && validIP == true) { throw new SpecialException('B'); } else if (validIP == false && validPort == false) { throw new SpecialException('C'); } if (validPort && validIP && validName) { if (EmptyId) { throw new SpecialException('E'); } if (String.IsNullOrWhiteSpace(Name)) { throw new SpecialException('F'); } char[] arrOfTxtName = Name.ToCharArray(); for (int i = 0; i < arrOfTxtName.Length; i++) { if (!char.IsLetter(arrOfTxtName[i])) { throw new SpecialException('G'); } } if (EmptyPassword) { throw new SpecialException('H'); } else if (!regularEx.IsMatch(Password)) { throw new SpecialException('I'); } try { _currentUser = new User(); _currentUser.ID = Id; _currentUser.Name = Name; _currentUser.Password = Password; _currentUser.Color = color; _currentUser.IsNew = IsNewUser; _currentUser.IsConnected = true; _mb = new MessageBase() { CurrentTime = DateTime.Now, CurrenUser = _currentUser, }; _tcpClient = new TcpClient(); _tcpClient.Connect(_ip, _port); _stream = _tcpClient.GetStream(); t = new Thread(() => { _bf.Serialize(_stream, _mb); MessageBase m = (MessageBase)_bf.Deserialize(_stream); if (m is MessageBase) { MessagesPack mp = new MessagesPack(); //***i must use an event. because its inside thread. when abort function will call it will wipe out all details if (m.op.NewUserIdlsAlreadyExistInDB) { OnMustThrowMessagesFromThread(mp.message4, EventArgs.Empty); t.Abort(); return; } if (m.op.ErrorState == 'd') { OnMustThrowMessagesFromThread(mp.message1, EventArgs.Empty); t.Abort(); return; } if (m.op.ErrorState == 'a') { OnMustThrowMessagesFromThread(mp.message2, EventArgs.Empty); t.Abort(); return; } if (m.op.ErrorState == 'b') { OnMustThrowMessagesFromThread(mp.message3, EventArgs.Empty); t.Abort(); return; } Connected = true; OnSetConnected(this, EventArgs.Empty); this._currentUser.ID = (string)m.CurrenUser.ID; StartRecieveMessages(); } }); t.Start(); } catch (SocketException) { throw new SpecialException('J'); } catch (ArgumentException) { throw new ArgumentException(); } catch (SpecialException) { } catch (Exception) { //throw new Exception(); } } }