private static void ServerListener_Recieved(object sender, Listener.RecieveEventArgs e) { string json = Encoding.UTF8.GetString(e.Data); SocketActionBase action = JsonConvert.DeserializeObject <SocketActionBase>(json); //ConsoleWriteLine($"Recieved {json} via sockets"); switch (action.Action) { case SocketActions.JOIN: MemberDto member = JsonConvert.DeserializeObject <MemberDto>(JsonConvert.SerializeObject(action.Data)); ConsoleWriteLine($"{member.Name} joined chat"); if (!CURRENT_CHAT.Members.Contains(member)) { CURRENT_CHAT.Members.Add(member); } if (!member.Equals(ME)) { ConnectTo(member); } UpdateCommonKey(); break; case SocketActions.KEY_UPDATE: KeyExchangeDto keyExchange = JsonConvert.DeserializeObject <KeyExchangeDto>(JsonConvert.SerializeObject(action.Data)); if (keyExchange.TTL + 1 == CURRENT_CHAT.Members.Count) { CURRENT_CHAT_COMMON_KEY = DIFFIE.GetCommonPrivateKey( keyExchange.KeyTemp, USER_CHAT_KEYS[CURRENT_CHAT.Name].PrivateKey, CURRENT_CHAT.P ); ConsoleWriteLine($"Got common key: {CURRENT_CHAT_COMMON_KEY}"); } else { UpdateCommonKey(keyExchange); } break; case SocketActions.MESSAGE: Message message = JsonConvert.DeserializeObject <Message>(JsonConvert.SerializeObject(action.Data)); string textCode = NOTEPAD.Decode(message.MessageText, CURRENT_CHAT_COMMON_KEY); string text = NOTEPAD.GetCodeText(textCode); ConsoleWriteLine($"{message.SenderName}: {text} ({message.TimeStamp.ToShortTimeString()})"); break; } }
public void Send(SocketActionBase action) { if (Sender == null || !Sender.Connected) { Sender = new Socket(Endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); Sender.Connect(Endpoint); } string json = JsonConvert.SerializeObject(action); byte[] data = Encoding.UTF8.GetBytes(json); byte[] message = BitConverter.GetBytes(data.Length).Concat(data).ToArray(); Sender.Send(message); Sender.Shutdown(SocketShutdown.Both); Sender.Close(); }