private void btn_send_Click(object sender, EventArgs e) { JObject ToSend = new JObject(); ToSend["Command"] = DateTime.Now.ToString("TalkTo"); ToSend["MessageTime"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); ToSend["Content"] = tb_content.Text; ToSend["TalkToUserName"] = TalkingUserName; MessageLib.SocketMessage sm = new MessageLib.SocketMessage(tcpc); sm.SendContent(ToSend); }
private void StartTalk(string IP, Int32 Port) { if (tcpc == null) { tcpc = new TcpClient(); tcpc.Connect(IPAddress.Parse(IP), Port); } JObject ToSend = new JObject(); ToSend["UserName"] = tb_username.Text; ToSend["Pwd"] = tb_password.Text; ToSend["Command"] = "Login"; MessageLib.SocketMessage sm = new MessageLib.SocketMessage(tcpc); sm.OnReceiveMessage += sm_OnReceiveMessage; sm.OnSendError += sm_OnSendError; sm.OnReceiveError += sm_OnReceiveError; SocketError se = new SocketError(); IAsyncResult R = tcpc.Client.BeginReceive(sm.MessageIndex, 0, 4, SocketFlags.None, out se, sm.SizeReceiveCallBack, tcpc); sm.SendContent(ToSend); }
/// <summary> /// 主要的消息处理逻辑 /// </summary> /// <param name="newmessage"></param> /// <param name="ReceiveTc"></param> /// <param name="Receiveskm"></param> void sm_OnReceiveMessage(Newtonsoft.Json.Linq.JObject newmessage, TcpClient ReceiveTc, MessageLib.SocketMessage Receiveskm) { if (newmessage["Command"].ToString() == "Login") { string UserName = newmessage["UserName"].ToString(); string Pwd = newmessage["Pwd"].ToString(); bool LoginR = System.Web.Security.Membership.ValidateUser(UserName, Pwd); JObject r = new JObject(); MembershipUser msr = Membership.GetUser(UserName); if (msr == null) { r["Status"] = "用户名" + UserName + ",不存在"; } else if (msr.IsLockedOut == true) { r["Status"] = "用户名" + UserName + ",密码错误次数太多,需由管理员处理"; } else if (LoginR == false) { r["Status"] = "用户密码不符"; } else { r["Status"] = "Success"; #region "多处登录,踢出" OnLineData ToKill = OnLineInf.SingleOrDefault(t => t.UserID == (Guid)msr.ProviderUserKey); if (ToKill != null) { JObject sr = new JObject(); sr["Status"] = "账号已在其他地方登录"; ToKill.skm.SendContent(sr); } #endregion OnLineData ToUpd = OnLineInf.SingleOrDefault(t => t.tcpl == ReceiveTc); ToUpd.UserID = (Guid)msr.ProviderUserKey; ToUpd.UserName = msr.UserName; ServerData.dbDataContext db = new ServerData.dbDataContext(System.Configuration.ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString); r["Command"] = "ImLogin"; //取得好友 var Friends = db.aspnet_Friendship.Where(t => t.aspnet_UserID == (Guid)msr.ProviderUserKey); r["Friends"] = new JArray(); foreach (var Frienditem in Friends) { MembershipUser msu = Membership.GetUser(Frienditem.FriendaspnetID); JObject JFriend = new JObject(); JFriend["UserName"] = msu.UserName.ToLower(); OnLineData old = OnLineInf.SingleOrDefault(t => t.UserID == (Guid)msu.ProviderUserKey); if (old != null) { JFriend["IP"] = old.IP; JFriend["Port"] = old.Port; JFriend["OnLine"] = true; } else { JFriend["IP"] = ""; JFriend["Port"] = ""; JFriend["OnLine"] = false; } (r["Friends"] as JArray).Add(JFriend); } //通知好友上线 var belFriends = db.aspnet_Friendship.Where(t => t.FriendaspnetID == (Guid)msr.ProviderUserKey); foreach (var Frienditem in belFriends) { OnLineData tonotice = OnLineInf.SingleOrDefault(t => t.UserID == Frienditem.aspnet_UserID); if (tonotice != null) { JObject ToSendMessage = new JObject(); ToSendMessage["Status"] = "Success"; ToSendMessage["Command"] = "FriendLogin"; ToSendMessage["FriendUserName"] = msr.UserName.ToLower(); ToSendMessage["IP"] = ((IPEndPoint)ReceiveTc.Client.RemoteEndPoint).Address.ToString(); tonotice.skm.SendContent(ToSendMessage); } } } Receiveskm.SendContent(r); this.Invoke(new Action(() => { this.Refresh(); })); ; } //服务器转发通讯 else if (newmessage["Command"].ToString() == "TalkTo") { MembershipUser tomsr = Membership.GetUser(newmessage["TalkToUserName"].ToString()); OnLineData old = OnLineInf.SingleOrDefault(t => t.UserID == (Guid)tomsr.ProviderUserKey); OnLineData SayFrom = OnLineInf.SingleOrDefault(t => t.tcpl == ReceiveTc); if (old != null) { newmessage["Command"] = "TalkFrom"; newmessage["Status"] = "Success"; newmessage["TalkFromUserName"] = SayFrom.UserName; old.skm.SendContent(newmessage); } else { JObject rtnr = new JObject(); rtnr["Command"] = "TalkToError"; rtnr["Status"] = "Success"; rtnr["UserName"] = newmessage["TakeToUserName"].ToString(); rtnr["Content"] = newmessage["Content"].ToString(); Receiveskm.SendContent(rtnr); } } //获取P2P的UDP端口 else if (newmessage["Command"].ToString() == "GetUDPHoleInf") { MembershipUser tomsr = Membership.GetUser(newmessage["UserName"].ToString()); OnLineData tofind = OnLineInf.SingleOrDefault(t => t.UserID == (Guid)tomsr.ProviderUserKey); JObject tor = new JObject(); tor["Command"] = "GetUDPHoleInf"; tor["Status"] = "Success"; tor["P2PPort"] = tofind == null ? "" : tofind.P2pPort.ToString(); Receiveskm.SendContent(tor); } }