//发送消息 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))); }
//send message to every user static private void Broadcast(Message message) { foreach (TcpClient client in users.Keys) { TCPHelper.SendMessage(message, client); } }
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; } }
/// <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; } } }
/// <summary> /// Send any kind of message (helper) /// </summary> /// <param name="message"></param> public void SendMessage(Message message) { TCPHelper.SendMessage(message, tcpClient); }
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; } }