private List <IMUserInfo> GetMyFriends(string userID) { List <IMUserInfo> myfriends = new List <IMUserInfo>(); lock (syncLocker) { List <IMUserInfo> list = null; string cachKey = "UserInfoDataAccess_GetIMUserList"; object o = Sharp.Common.CacheContainer.GetCache(cachKey); if (o == null) { list = new UserInfoClient().GetIMUserList().List(); Sharp.Common.CacheContainer.AddCache(cachKey, list, 60 * 60);//缓存1小时 } else { list = o as List <IMUserInfo>; } foreach (IMUserInfo theuser in list) { if (theuser.ID == userID) { continue; } //判断其他好友是否在线 IMUserInfo myfriend = theuser.Clone(); myfriend.IsOnline = userManager.ContainsKey(theuser.ID); myfriends.Add(myfriend); } } return(myfriends); }
//用户状态改变通知<5> private void IncomingUserStateNotify(PacketHeader header, Connection connection, UserStateContract userStateContract) { lock (syncLocker) { IMUserInfo u = Common.GetFriend(userStateContract.UserID); if (u != null) { ChatListSubItem item = userItem[userStateContract.UserID]; if (item != null) { IMUserInfo user = item.Tag as IMUserInfo; if (user != null) { if (userStateContract.OnLine == OnlineState.Online) { u.UserState = (int)OnlineState.Online; item.Status = ChatListSubItem.UserStatus.Online; user.IsOnline = true; } else { u.UserState = (int)OnlineState.Offline; item.Status = ChatListSubItem.UserStatus.OffLine; user.IsOnline = false; //当某用户下线后,删除此用户相关的p2p 通道 Common.RemoveUserConn(userStateContract.UserID); } } } } } }
public chatMain(IMUserInfo friend) : this() { // TODO: Complete member initialization this.friend = friend; //labelFriendName.Text = friend.DisplayName; //labelFriendSignature.Text = friend.DisplaySignature; //this.Text = "正在和" + labelFriendName.Text + "对话"; }
public static void AddFriend(string userID, IMUserInfo theUser) { lock (dictLocker) { if (AllUserDic.ContainsKey(userID)) { AllUserDic.Remove(userID); } AllUserDic.Add(userID, theUser); } }
public static string AutoLog(string userNo, string Pwd) { string error = string.Empty; ConnectionInfo connInfo; Connection newTcpConnection; try { connInfo = new ConnectionInfo(Common.ServerIP, Common.Port); newTcpConnection = TCPConnection.GetConnection(connInfo); Common.TcpConn = newTcpConnection; connInfo.LocalEndPoint.Address = IPAddress.Parse(Sharp.Common.Utils.GetMachineIP()); TCPConnection.StartListening(connInfo.LocalEndPoint); //在契约类中保存用户名和密码 IMUserInfo userinfo = new IMUserInfo(); userinfo.Code = userNo; userinfo.Pwd = Pwd; //发送契约类给服务器端,并获取返回的结果 UserLoginContract loginContract = newTcpConnection. SendReceiveObject <UserLoginContract>("UserLogin", "ResUserLogin", 80000, userinfo); //如果登陆成功 if (string.IsNullOrWhiteSpace(loginContract.Message)) { //为简便,在此处使用了静态类保存用户相关信息 Common.CurrentUser = loginContract.UserContract; Common.ConnInfo = connInfo; if (OnLoginSucced != null) { OnLoginSucced(); } } else { error = loginContract.Message; } } catch (Exception ex) { error = ex.Message; } return(error); }
//#region 向用户终端发送消息 ////public void sendMsgToOneUser(ClassMsg msg, System.Net.IPAddress Ip, int Port)//发送消息到用户的一个联系人 ////{ //// msg.ID = selfInfo.ID;//标识本人的ID号 //// this.sockUDP1.Send(Ip, Port, new ClassSerializers().SerializeBinary(msg).ToArray()); ////} //#endregion //#region 接收数据方法 //private void sockUDP1_DataArrival(byte[] Data, System.Net.IPAddress Ip, int Port) //{ // //DataArrivaldelegate outdelegate = new DataArrivaldelegate(DataArrival); // //this.BeginInvoke(outdelegate, new object[] { Data, Ip, Port }); //} //private delegate void DataArrivaldelegate(byte[] Data, System.Net.IPAddress Ip, int Port); ////private void DataArrival(byte[] Data, System.Net.IPAddress Ip, int Port) ////{ //// ClassMsg msg = new ClassSerializers().DeSerializeBinary((new System.IO.MemoryStream(Data))) as ClassMsg; //// switch (msg.MsgInfoClass) //// { //// case -1: //// //MessageBox.Show(msg.MsgContent); //// break; //// case 0://有用户离线 //// userSingnOut(msg.ID);//处理用户离线 //// break; //// case 1://服务器告诉自己已经登录,登录过程 //// SuccessLogin(msg); //// break; //// case 2://服务器告诉用户自己目前在线 //// //updateSelfState();//更新当前用户在线状态 //// break; //// case 3://服务器告诉用户有新的联系人登录 //// NewUserLogin(new ClassSerializers().DeSerializeBinary((new System.IO.MemoryStream(msg.MsgContent))) as ClassUserInfo);//添加新登录的用户资料 //// break; //// case 4://收到用户部分联系人的资料 //// UsersDataArrival((new ClassSerializers().DeSerializeBinary((new System.IO.MemoryStream(msg.MsgContent))) as ClassUsers));//收到用户所有联系人的资料 //// break; //// case 5://收到用户联系人发送来的对话消息 //// //UserChatArrival(msg, Ip, Port);//处理对话消息 //// break; //// case 6://联系人返回已经收到刚才发送的对话消息 //// //returnChatArrival(msg.ID);//联系人返回已经收到刚才发送的对话消息 //// break; //// case 7: //// //收到联系人发送来的群发通知消息 //// //noticeArrival(msg, Ip, Port);//处理联系人发送来的群发通知消息 //// break; //// case 10://收到联系人发出发送文件请求 //// //sendFileRequest(msg, Ip, Port); //// break; //// case 11://收到联系人发送来的gif图片流 //// //UserGifArrival(msg, Ip, Port);//处理gif图片消息 //// break; //// case 12://收到用户发送来的文本消息 //// UserTextChatArrival(msg, Ip, Port);//处理用户发送来的文本消息 //// break; //// } ////} ////private void UsersDataArrival(ClassUsers users)//收到用户所有联系人的资料 ////{ //// ClassUserInfo UserInfo; //// foreach (ClassUserInfo userinfo in users) //// { //// UserInfo = findUser(userinfo.ID); //// if (userinfo.ID == selfInfo.ID) //// break;//如果新登录的联系人是自己则退出 //// if (UserInfo == null) //// { //// this.MyUsers.add(userinfo); //// ChatListSubItem subItem = new ChatListSubItem(userinfo.ID, userinfo.UserName, userinfo.AssemblyVersion, //ChatListSubItem.UserStatus.Online); //// this.chatListBox.Items[1].SubItems.AddAccordingToStatus(subItem); //// //updateGroupInfo(userinfo); //// } //// else //// { //// ClassUserInfo user = new ClassUserInfo(); //// user.ID = userinfo.ID; //// user.IP = userinfo.IP; //// user.Port = userinfo.Port; //// user.AssemblyVersion = userinfo.AssemblyVersion; //// this.UpdateUser(user);//更新用户状态 //// foreach (ChatListItem item in chatListBox.Items) //// { //// foreach (ChatListSubItem subItem in item.SubItems) //// { //// if (subItem.Tag.ToString().ToLower() == user.ID.ToLower()) //// { //// subItem.Status = ChatListSubItem.UserStatus.Online; //// break; //// } //// } //// } //// } //// } ////} ////private void UserTextChatArrival(ClassMsg msg, System.Net.IPAddress Ip, int Port)//处理用户发送来的文本消息 ////{ //// ClassUserInfo userinfo = this.findUser(msg.ID); //// if (userinfo != null) //// { //// string title = userinfo.UserName + "(" + System.DateTime.Now.ToString() + ")"; //// //MsgAddToDB(msgRtf,msg.ID,selfInfo.ID,msg.AssemblyVersion,System.DateTime.Now.ToString(),true);//将消息添加进数据库 //// // foreach (System.Windows.Forms.Form form in forms) //// // if (form.Tag.ToString() == userinfo.ID) //// // { //// // frmchatMain f = (form as frmchatMain); //// // f.newTextMsg(msg.MsgContent, title, new System.Drawing.Font("宋体", 10), Color.Blue); //// // f.Activate(); //// // return; //// // } //// // frmchatMain newf = new frmchatMain(); //// // newf.Tag = msg.ID; //// // newf.Text = "与 " + userinfo.UserName + "(" + userinfo.ID + ") 对话"; //// // newf.setUserName(userinfo.UserName); //// // newf.newTextMsg(msg.MsgContent, title, new System.Drawing.Font("宋体", 10), Color.Blue); //// // forms.add(newf); //// // //ShowNotifyIcon(1, "", "收到 " + userinfo.UserName + "(" + userinfo.ID + ") 发送给您的新消息。"); //// // newf.Show(); //// } ////} //#endregion //#region 接收后信息的回调方法 //private void userSingnOut(string msgID) //{ // //RemoveUser(msgID); // foreach (ChatListSubItem subItem in this.chatListBox.Items[1].SubItems) // { // if (subItem.NicName == msgID) // { // subItem.Status = ChatListSubItem.UserStatus.OffLine; // break; // } // } // //this.chatListBox.Items[1].SubItems[0].Status = ""; //} ////private void SuccessLogin(ClassMsg msg)//服务器告诉用户已经成功登录的处理过程 ////{ ////this.Text="成功登陆"; ////ClassUserInfo self = (new ClassSerializers().DeSerializeBinary(new System.IO.MemoryStream(msg.MsgContent))) as ClassUserInfo; ////selfInfo.UserName = self.UserName; ////selfInfo.State = 1; ////ShowNotifyIcon(1,"","LanMsg已经成功登录服务器。"); ////} ////private void NewUserLogin(ClassUserInfo userinfo)//添加新登录的用户资料 ////{ //// if (userinfo.ID == selfInfo.ID) //// return;//如果新登录的联系人是自己则退出 //// //this.Text="新用户"+ userinfo.ID; //// ClassUserInfo UserInfo; //// UserInfo = findUser(userinfo.ID); //// if (UserInfo == null) //// { //// this.MyUsers.add(userinfo); //// ChatListSubItem subItem = new ChatListSubItem(userinfo.ID, userinfo.UserName, userinfo.AssemblyVersion, ChatListSubItem.UserStatus.Online); //// this.chatListBox.Items[1].SubItems.AddAccordingToStatus(subItem); //// // 增加一个新用户 //// } //// else //// { //// ClassUserInfo user = new ClassUserInfo(); //// user.ID = userinfo.ID; //// user.IP = userinfo.IP; //// user.Port = userinfo.Port; //// user.AssemblyVersion = userinfo.AssemblyVersion; //// this.UpdateUser(user);//更新用户状态 //// foreach (ChatListItem item in chatListBox.Items) //// { //// foreach (ChatListSubItem subItem in item.SubItems) //// { //// if (subItem.Tag.ToString().ToLower() == user.ID.ToLower()) //// { //// subItem.Status = ChatListSubItem.UserStatus.Online; //// break; //// } //// } //// } //// //更改新用户的状态 //// } //// // MessageBox.Show("1"); ////} //#endregion //#region 操作当前用户的方法 ////public ClassUserInfo findUser(string ID)//在我的用户列表中查找用户ID ////{ //// foreach (ClassUserInfo userinfo in this.MyUsers) //// if (userinfo.ID.ToLower() == ID.ToLower()) //// return userinfo; //// return null; ////} /////// <summary> /////// 更新用户状态 IP 和端口信息 /////// </summary> /////// <param name="user"></param> ////public void UpdateUser(ClassUserInfo user) ////{ //// //更新用户状态 IP 和端口信息 //// foreach (ClassUserInfo userinfo in this.MyUsers) //// { //// if (userinfo.ID.ToLower() == user.ID.ToLower()) //// { //// userinfo.State = user.State; //// userinfo.IP = user.IP; //// userinfo.Port = user.Port; //// break; //// } //// } ////} ////public void RemoveUser(string ID) ////{ //// foreach (ClassUserInfo userinfo in this.MyUsers) //// { //// if (userinfo.ID.ToLower() == ID.ToLower()) //// { //// this.MyUsers.Romove(userinfo); //// break; //// } //// } ////} //#endregion //#region 设置一些用户菜单事件 //private void skinButton_State_Click(object sender, EventArgs e) //{ // this.skinContextMenuStrip_State.Show(skinButton_State, new Point(0, skinButton_State.Height), ToolStripDropDownDirection.Right); //} //private void toolStripMenuItem20_Click(object sender, EventArgs e) //{ // ToolStripMenuItem Item = (ToolStripMenuItem)sender; // skinButton_State.Image = Item.Image; // skinButton_State.Tag = Item.Tag; // // this.myselfChatListSubItem.Status = (ChatListSubItem.UserStatus)Convert.ToInt32(skinButton_State.Tag); //} //private void toolStripMenuItem30_Click(object sender, EventArgs e) //{ // ToolStripMenuItem Item = (ToolStripMenuItem)sender; // skinButton_State.Image = Item.Image; // skinButton_State.Tag = Item.Tag; //} //private void toolStripMenuItem31_Click(object sender, EventArgs e) //{ // ToolStripMenuItem Item = (ToolStripMenuItem)sender; // skinButton_State.Image = Item.Image; // skinButton_State.Tag = Item.Tag; //} //private void toolStripMenuItem32_Click(object sender, EventArgs e) //{ // ToolStripMenuItem Item = (ToolStripMenuItem)sender; // skinButton_State.Image = Item.Image; // skinButton_State.Tag = Item.Tag; //} //private void toolStripMenuItem33_Click(object sender, EventArgs e) //{ // ToolStripMenuItem Item = (ToolStripMenuItem)sender; // skinButton_State.Image = Item.Image; // skinButton_State.Tag = Item.Tag; //} //#endregion #region 双击打开用户列表 private void chatListBox_DoubleClickSubItem(object sender, ChatListEventArgs e) { ChatListSubItem item = e.SelectSubItem; if (item.NicName == "网页用户") { IMUserInfo friend = new IMUserInfo(); friend.ID = item.Tag.ToString(); friend.NickyName = "网页用户"; friend.Signature = "网页用户"; item.IsTwinkle = false;//不闪烁 FormManager.Instance.ActivateOrCreateFormSend(item.Tag.ToString(), friend); } else { IMUserInfo chatuser = item.Tag as IMUserInfo; item.IsTwinkle = false;//不闪烁 FormManager.Instance.ActivateOrCreateFormSend(chatuser); } }
internal void ActivateOrCreateFormSend(string userid, IMUserInfo chatuser) { lock (locker) { IManagedForm form = GetForm(userid); if (form == null) { chatMain f = new chatMain(chatuser); form = f; Add(f); f.Show(); } (form as chatMain).Activate(); if (Common.ContainsMsg(userid)) { (form as chatMain).ShowOtherTextChat(userid, Common.GetMsgContractList(userid)); Common.RemoveMsg(userid); } } }
internal void ActivateOrCreateFormSend(IMUserInfo chatuser) { lock (locker) { IManagedForm form = GetForm(chatuser.ID); if (form == null) { frmchatMain f = new frmchatMain(chatuser); form = f; Add(f); } (form as frmchatMain).Show(); (form as frmchatMain).Activate(); if (Common.ContainsMsg(chatuser.ID)) { (form as frmchatMain).ShowOtherTextChat(chatuser.ID, Common.GetMsgContractList(chatuser.ID)); Common.RemoveMsg(chatuser.ID); } } }
private void 呼叫ToolStripMenuItem_Click(object sender, EventArgs e) { ToolStripMenuItem item = sender as ToolStripMenuItem; if (string.IsNullOrWhiteSpace(Common.CurrentUser.AgentID)) { MessageBox.Show("当前用户没有分机号,不能" + item.Text); return; } if (chatListBox.SelectSubItem != null && chatListBox.SelectSubItem.Tag != null) { IMUserInfo user = chatListBox.SelectSubItem.Tag as IMUserInfo; if (user != null) { if (user.IsOnline) { if (string.IsNullOrEmpty(user.AgentID)) { MessageBox.Show("该用户没有分机号,不能" + item.Text); } else { if (item == 呼叫转移ToolStripMenuItem) { CallTalkFactory.GetCallInstance().Transfer(Common.CurrentUser.AgentID, user.AgentID); } else { CallTalkFactory.GetCallInstance().OutCall(user.AgentID); } } } else { MessageBox.Show("该用户不在线,不能" + item.Text); } } } }
public static void SendMess(string userid, string mes, string toid) { try { ConnectionInfo connInfo; string[] ipAndPort = new FrameCommonClient.ParameterInfoClient().GetTwoValue("ecda7fbe-cf9d-4d89-b478-d31da5d0a7f8"); int port = int.Parse(ipAndPort[1]); connInfo = new ConnectionInfo(ipAndPort[0], port); if (newTcpConnection == null) { //InitConnection(); newTcpConnection = TCPConnection.GetConnection(connInfo); TCPConnection.StartListening(connInfo.LocalEndPoint); AuthorityEntity.IM.IMUserInfo userinfo = new IMUserInfo(); userinfo.ID = "SB_WEB_INFO"; userinfo.Code = "SB_WEB_INFO"; userinfo.IsWebMsg = true; UserLoginContract loginContract = newTcpConnection. SendReceiveObject <UserLoginContract>("UserLogin", "ResUserLogin", 80000, userinfo); NetworkComms.AppendGlobalIncomingPacketHandler <MsgEntity>("ServerChatMessage", IncomingChatMessage); } MsgEntity chatContract = new MsgEntity(); chatContract.SenderID = userid; chatContract.Reciver = toid; chatContract.MsgContent = mes; chatContract.SendTime = DateTime.Now; chatContract.MsgSendType = 4; //chatContract.IsWebMsg = true; //chatContract.ImageList = imageWrapperList; newTcpConnection.SendObject("ChatMessage", chatContract); } catch (Exception ex) { throw ex; } }
public void OnGetUserInfo(YIMEngine.ErrorCode code, IMUserInfo userInfo) { }
//处理用户登录 private void IncomingLoginHandler(PacketHeader header, Connection Connection, IMUserInfo loginInfo) { try { //从数据库中验证登录信息 string ip = Connection.ConnectionInfo.LocalEndPoint.ToString(); string port = Connection.ConnectionInfo.LocalEndPoint.Port.ToString(); string error = string.Empty; View_IMUser userinfo = null; if (loginInfo.IsWebMsg) { userinfo = new View_IMUser(); userinfo.ID = loginInfo.Code; userinfo.Code = loginInfo.Code; userinfo.Name = "网页用户"; } else { userinfo = new AuthorityClient.LoginClient().Login(loginInfo.Code, loginInfo.Pwd, ip, port, out error); } if (userinfo == null) { UserLoginContract resContract = new UserLoginContract(error, null); Connection.SendObject("ResUserLogin", resContract); } else { UserLoginContract resContract = new UserLoginContract(error, userinfo.Clone()); Connection.SendObject("ResUserLogin", resContract); if (string.IsNullOrWhiteSpace(error)) { lock (syncLocker) { //同一账号登陆,先退出已经登陆的客户端 if (userManager.ContainsKey(userinfo.ID)) { //通知相应的连接,关闭此连接 foreach (Connection conn in NetworkComms.GetExistingConnection(userManager[userinfo.ID], ConnectionType.TCP)) { conn.SendObject("CloseConnection", "msg"); } userManager.Remove(userinfo.ID); } //注册新的用户 if (!userManager.ContainsKey(userinfo.ID)) { userManager.Add(userinfo.ID, Connection.ConnectionInfo.NetworkIdentifier); } } //用户上线后,通知其他用户 UserStateNotify(userinfo.ID, OnlineState.Online); } } } catch (Exception ex) { LogTools.LogException(ex, "IncomingLoginHandler"); } }