Example #1
0
        //发送消息
        private void btnSend_Click(object sender, RoutedEventArgs e)
        {
            string content = txtSend.Text.Trim();
            PerMsg p       = new PerMsg(UserName, content);
            Chat   boxItem = (Chat)listChat.SelectedItem;

            boxItem.Msgs.Add(p);
            txtSend.Text = "";
            TalkContract talk = new TalkContract(LocalId, UserName, boxItem.SenderId, content);

            helper.SendMessage(string.Format("TALK@{0}", DataHelpers.XMLSer <TalkContract>(talk)));
        }
Example #2
0
 //send message to every user
 static private void Broadcast(Message message)
 {
     foreach (TcpClient client in users.Keys)
     {
         TCPHelper.SendMessage(message, client);
     }
 }
Example #3
0
 private void btnLogin_Click(object sender, RoutedEventArgs e)
 {
     Connect();
     if (txtId.Text == "" || txtPwd.Password == "")
     {
         ShowMsg(null, "请输入用户ID和密码");
     }
     else
     {
         string        ID    = txtId.Text.Trim();
         string        Pwd   = txtPwd.Password.Trim();
         LoginContract login = new LoginContract(ID, Pwd);
         helper.SendMessage(string.Format("LOGIN@{0}", DataHelpers.XMLSer <LoginContract>(login)));
         this.btnLogin.IsEnabled = false;
     }
 }
Example #4
0
        /// <summary>
        /// Receive message in loop and prepare answer
        /// </summary>
        /// <param name="client"></param>
        static private void TalkToClient(TcpClient client)
        {
            while (true)
            {
                //if client has disconnected, remove him from the list
                if (!client.Connected)
                {
                    if (users.Keys.Contains(client))
                    {
                        Broadcast(new TextMessage(DateTime.Now, "Server", String.Format("User {0} disconnected", users[client])));
                        users.Remove(client);
                        Log(String.Format("User {0} disconnected", users[client]));
                    }
                    else
                    {
                        Log("Couldn't register user");
                    }
                    break;
                }
                Message receivedMessage = TCPHelper.ReceiveMessage(client);

                switch (receivedMessage.MessageHeader)
                {
                case Header.NameRequest:
                    //In case of name request, check is such name is taken, if so, reject this name
                    NameRequestMessage requestMessage = receivedMessage as NameRequestMessage;
                    if (users.Values.Contains(requestMessage.NameToRequest))
                    {
                        TCPHelper.SendMessage(new Message(Header.NameRejected, DateTime.Now, "Server"), client);
                        Log(String.Format("Username {0} taken", requestMessage.NameToRequest));
                        client.Close();
                    }
                    else
                    {
                        //If we already have a connected user with a name, change his name to a new one and send accept message. Also, tell every user about the name change
                        if (users.Keys.Contains(client))
                        {
                            string previousName = users[client];
                            users[client] = requestMessage.NameToRequest;
                            TCPHelper.SendMessage(new Message(Header.NameAccepted, DateTime.Now, "Server"), client);
                            Broadcast(new TextMessage(DateTime.Now, "Server", String.Format("User {0} is now {1}", previousName, users[client])));
                            Log(String.Format("User {0} is now {1}", previousName, users[client]));
                        }
                        //If this is a new user, add him to our user list, send him accept message, and also notify everyone about new user
                        else
                        {
                            users.Add(client, requestMessage.NameToRequest);
                            TCPHelper.SendMessage(new Message(Header.NameAccepted, DateTime.Now, "Server"), client);
                            Broadcast(new TextMessage(DateTime.Now, "Server", String.Format("User {0} has joined the chat", requestMessage.NameToRequest)));
                            Log(String.Format("User {0} has joined the chat", users[client]));
                        }
                    }
                    break;

                //If we get a textmessage, send it to everyone
                case Header.TextMessage:
                    TextMessage textMessage = receivedMessage as TextMessage;
                    if (users.Keys.Contains(client))
                    {
                        Broadcast(new TextMessage(DateTime.Now, users[client], textMessage.Text));
                        Log(new TextMessage(DateTime.Now, users[client], textMessage.Text).ToString());
                    }
                    else
                    {
                        Log("Uknown message: " + receivedMessage.ToString());
                        client.Close();
                    }
                    break;

                //If we get an image, send it to everyone
                case Header.ImageMessage:
                    ImageMessage imageMessage = receivedMessage as ImageMessage;
                    if (users.Keys.Contains(client))
                    {
                        Broadcast(new ImageMessage(DateTime.Now, users[client], imageMessage.Image));
                        Log(new TextMessage(DateTime.Now, users[client], "Image sent").ToString());
                    }
                    else
                    {
                        Log("Uknown message: " + receivedMessage.ToString());
                        client.Close();
                    }
                    break;

                default:
                    Log("Uknown message: " + receivedMessage.ToString());
                    client.Close();
                    break;
                }
            }
        }
Example #5
0
 /// <summary>
 /// Send any kind of message (helper)
 /// </summary>
 /// <param name="message"></param>
 public void SendMessage(Message message)
 {
     TCPHelper.SendMessage(message, tcpClient);
 }
Example #6
0
        public static void Handle(object sender, string data)
        {
            ServerHandle  server = new ServerHandle();
            IServerHandle ish    = (IServerHandle)server;
            TCPHelper     helper = (TCPHelper)sender;

            string[] d = Data_Init(data);
            switch (d[0])
            {
            case "LOGIN":
                LoginContract login = null;
                try
                {
                    login = WTalk.Helpers.DataHelpers.DeXMLSer <LoginContract>(d[1]);
                }
                catch { }
                LoginCallBack callBack = ish.Login(helper.tcpClient, login);
                if (ShowOnServerWindow != null)
                {
                    if (callBack.LoginStatus == Status.Yes)
                    {
                        UserArgs args = new UserArgs
                        {
                            IP = helper.tcpClient.Client.RemoteEndPoint.ToString(),
                            Id = login.UserId
                        };
                        string log = string.Format("{0}-->Login Success", helper.tcpClient.Client.RemoteEndPoint.ToString());
                        ShowOnServerWindow(null, log);
                        if (LoginHandler != null)
                        {
                            LoginHandler(null, args);
                        }
                    }
                    else
                    {
                        string log = string.Format("{0}-->Login Fail", helper.tcpClient.Client.RemoteEndPoint.ToString());
                        ShowOnServerWindow(null, log);
                    }
                }
                string msg = string.Format("LOGINCALLBACK@{0}", WTalk.Helpers.DataHelpers.XMLSer <LoginCallBack>(callBack));
                helper.SendMessage(msg);
                break;

            case "SIGNUP":
                SignupContract signup = null;
                try
                {
                    signup = DataHelpers.DeXMLSer <SignupContract>(d[1]);
                }
                catch { }
                SignUpCallBack signUpCallBack = ish.Signup(signup);
                if (ShowOnServerWindow != null)
                {
                    string log = string.Format("{0}-->Signup:{1}", helper.tcpClient.Client.RemoteEndPoint.ToString(), signUpCallBack.MoreMsg);
                    //if (callBack.LoginStatus == Status.Yes)
                    //{
                    //    string log = string.Format("{0}-->Signup", helper.tcpClient.Client.RemoteEndPoint.ToString());
                    //    ShowOnServerWindow(null, log);
                    //}
                    //else
                    //{
                    //    string log = string.Format("{0}-->Login Fail", helper.tcpClient.Client.RemoteEndPoint.ToString());
                    //    ShowOnServerWindow(null, log);
                    //}
                    ShowOnServerWindow(null, log);
                }
                helper.SendMessage(string.Format("SIGNUPCALLBACK@{0}", DataHelpers.XMLSer <SignUpCallBack>(signUpCallBack)));
                break;

            case "LOGOUT":
                //string logoutlog = string.Format("{0}-->登出", helper.tcpClient.Client.RemoteEndPoint.ToString());
                //if(ShowOnServerWindow != null)
                //{
                //    ShowOnServerWindow(null, logoutlog);
                //}
                break;

            case "SEARCH":
                SearchContract search = null;
                try
                {
                    search = DataHelpers.DeXMLSer <SearchContract>(d[1]);
                    SearchCallBack back = ish.Search(search);
                    helper.SendMessage(string.Format("SEARCHCALLBACK@{0}", DataHelpers.XMLSer <SearchCallBack>(back)));
                }
                catch
                {
                }
                break;

            case "ADD":
                AddContract add = null;
                try
                {
                    add = DataHelpers.DeXMLSer <AddContract>(d[1]);
                    AddComfirmArgs args = ish.Add(add);
                    if (args.IP != "Offline")
                    {
                        AddHandler(null, args);
                    }
                }
                catch
                {
                    break;
                }
                break;

            case "REMOVE":
                RemoveContract remove = null;
                try
                {
                    remove = DataHelpers.DeXMLSer <RemoveContract>(d[1]);
                    ish.RemoveFriends(remove);
                    if (RemoveFriendHandler != null)
                    {
                        RemoveFriendHandler(null, remove);
                    }
                }
                catch (Exception e)
                {
                    throw e;
                }
                break;

            case "TALK":
                TalkContract talk = new TalkContract();
                try
                {
                    talk = DataHelpers.DeXMLSer <TalkContract>(d[1]);
                    if (TalkHandler != null)
                    {
                        TalkHandler(null, talk);
                    }
                }
                catch
                {
                }
                break;

            case "ADDCONFIRMCALLBACK":
                AddConfirmCallBack accb        = null;
                AddCallBack        addCallBack = null;
                try
                {
                    accb        = DataHelpers.DeXMLSer <AddConfirmCallBack>(d[1]);
                    addCallBack = ish.AddComfirm(accb);
                    if (UpdateFriendListHandler != null)
                    {
                        UpdateFriendListHandler(null, addCallBack);
                    }
                }
                catch
                {
                    break;
                }
                break;

            default:
                break;
            }
        }