示例#1
0
        void Receive()
        {
            try
            {
                while (true)
                {
                    byte[] data = new byte[1024 * 5000];
                    clientSocket.Receive(data);
                    string message = (string)Deserialize(data);
                    string MsgType = message.Split('|')[2];
                    if (MsgType == "ClientData")
                    {
                        string sendPoint        = message.Split('|')[0];
                        bool   checkClientExist = false;
                        foreach (Client client in listClient)
                        {
                            if (client.EndPoint == sendPoint)
                            {
                                checkClientExist = true;
                                break;
                            }
                        }
                        if (checkClientExist == false)
                        {
                            Client client = new Client(message.Split('|')[0], message.Split('|')[3]);
                            listClient.Add(client);
                            AddClientToPnlListClient(client);
                            AddClientToPnlMsg(client);
                        }
                        if (SelectedClient == null)
                        {
                            SelectedClient           = listClient[0];
                            labelSelectedClient.Text = SelectedClient.Name + " - " + SelectedClient.EndPoint;
                            foreach (Control control in pnlListClients.Controls)
                            {
                                if (control.Name == SelectedClient.EndPoint)
                                {
                                    control.BackColor = Color.FromArgb(180, 180, 180);
                                }
                            }
                        }
                    }
                    else if (MsgType == "Image")
                    {
                        Client client = GetClientData(message.Split('|')[0]);
                        Image  image  = DecryptImage(message.Split('|')[3]);
                        if (image != null)
                        {
                            DisplayImage(image, "receive", client);
                            client.NewMsg = true;
                            foreach (Panel panel in pnlListClients.Controls)
                            {
                                if (panel.Name == client.EndPoint)
                                {
                                    if (this.InvokeRequired)
                                    {
                                        this.BeginInvoke((MethodInvoker) delegate()
                                        {
                                            panel.BackColor = Color.Red;
                                        });
                                    }
                                    else
                                    {
                                        panel.BackColor = Color.Red;
                                    }
                                }
                            }
                        }
                    }
                    else if (MsgType.Contains("Text") == true)
                    {
                        //string cypher_sign = message.Split('~')[1];
                        string cypher    = message.Split('|')[3];
                        string sign      = message.Split('|')[4];
                        string msgIndex  = MsgType.Remove(0, 4);
                        string msg       = RSA_Crypto.Decrypt(Convert.FromBase64String(cypher));
                        Client client    = GetClientData(message.Split('|')[0]);
                        string publicKey = client.PublicKey;
                        byte[] signature = Convert.FromBase64String(sign);
                        MD5    md5       = MD5.Create();
                        string hashedMsg = Convert.ToBase64String(md5.ComputeHash(Encoding.UTF8.GetBytes(msg)));
                        if (RSA_Crypto.VerifyData(publicKey, msg, signature) == true)
                        {
                            DisplayText(msg, "receive", msgIndex, client);
                            SendEcho(client, hashedMsg, msgIndex);
                        }

                        if (WindowState != FormWindowState.Minimized && SelectedClient == client)
                        {
                            Thread.Sleep(10);
                            SendEcho(client, hashedMsg, msgIndex);
                        }
                        else
                        {
                            Message unreadMsg = new Message(Convert.ToInt32(msgIndex), hashedMsg, 1);
                            client.UnreadMessages.Add(unreadMsg);
                            client.NewMsg = true;
                            foreach (Panel panel in pnlListClients.Controls)
                            {
                                if (panel.Name == client.EndPoint)
                                {
                                    if (this.InvokeRequired)
                                    {
                                        this.BeginInvoke((MethodInvoker) delegate()
                                        {
                                            panel.BackColor = Color.Red;
                                        });
                                    }
                                    else
                                    {
                                        panel.BackColor = Color.Red;
                                    }
                                }
                            }
                        }
                    }
                    else if (MsgType.Contains("Echo") == true)
                    {
                        string cypher    = message.Split('|')[3];
                        string sign      = message.Split('|')[4];
                        string msgIndex  = MsgType.Remove(0, 4);
                        string msg       = RSA_Crypto.Decrypt(Convert.FromBase64String(cypher));
                        Client client    = GetClientData(message.Split('|')[0]);
                        string publicKey = client.PublicKey;
                        byte[] signature = Convert.FromBase64String(sign);
                        if (RSA_Crypto.VerifyData(publicKey, msg, signature) == true)
                        {
                            int state = client.ChangeMsgState(msgIndex, msg);
                            ChangeMsgState(msgIndex, state, client);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Close();
            }
        }