silverlight中Wcf双工通信

2016-08-20 10:34:10来源:http://zhaojie.blog.51cto.com/1768828/1194249作者:huohe2009人点击


一.创建WCF应用程序


接口文件:



[ServiceContract(Namespace="Silverlight",CallbackContract=typeof(IDuplexClient))] publicinterfaceIDuplexService { ///<summary> ///登陆的时候调用 ///</summary> ///<paramname="name">名字</param> ///<paramname="quantity">id</param> [OperationContract(IsOneWay=true)] voidLogin(stringname,intid); ///<summary> ///发送消息 ///</summary> ///<paramname="message">消息内容</param> ///<paramname="id">大于0为私聊</param> ///<paramname="id">自己的ID</param> [OperationContract(IsOneWay=true)] voidSay(stringmessage,intid,intuid); } ///客服端调用 //[ServiceContract] publicinterfaceIDuplexClient { //返回登陆人员 [OperationContract(IsOneWay=true)] voidrFriendList(List<UserInfo>friendList); ///<summary> ///系统消息 ///</summary> ///<paramname="message">返回消息</param> ///<paramname="type">0代表异地登陆,-1代表用户异常,-2用户上线,-3用户下线</param> [OperationContract(IsOneWay=true)] voidrSysMessage(stringmessage,inttype,intid); } //封装要传送的数据 [DataContract] publicclassUserInfo { publicUserInfo(stringname,intid) { _id=id; _name=name; } [DataMember] publicint_id{get;set;} [DataMember] publicstring_name{get;set;} }

二. 实现接口



publicclassOrderService:IDuplexService { IDuplexClientclient=OperationContext.Current.GetCallbackChannel<IDuplexClient>();//构建用户通道 List<UserInfo>lst=newList<UserInfo>();//存放登录用户 privatestaticDictionary<IDuplexClient,UserInfo>onlineUser=newDictionary<IDuplexClient,UserInfo>();//用每个用户通道和用户信息组成字典存储当前用户列表#regionIDuplexService成员 publicvoidLogin(stringname,intid) { //判断是否已经登陆 if(onlineUser.Values.Where(h=>h._name==name).Count()>0) { IDuplexClientrepertClient=onlineUser.Where(f=>f.Value._name==name).First().Key; //返回给此客户端重复登陆信息,强迫其下线 onlineUser.Remove(repertClient); repertClient.rSysMessage("帐号在异地登录,被迫下线。",-1,0); //通知好友你上线了 foreach(varouinonlineUser) { ou.Key.rSysMessage(name+":下线了",-3,id);//回调接收方 } } loginChat(name,id); } publicvoidSay(stringmessage,intid,intuid) { IDuplexClientclient=null; if(id==0)//群聊 { foreach(varouinonlineUser) { ou.Key.rSysMessage(message,id,uid);//回调接收方 } } else{ client=channel(id);//获取接收方通道 if(client!=null)//如果接收方在线 { client.rSysMessage(message,id,uid);//回调接收方 } } } #endregion publicvoidloginChat(stringuserName,intid)//登陆聊天模块 { lst.Add(newUserInfo(userName,id)); client.rFriendList(lst);//返回好友列表 //通知好友你上线了 foreach(varouinonlineUser) { ou.Key.rSysMessage(userName+":上线了",-2,id);//回调接收方 } onlineUser.Add(client,newUserInfo(userName,id));//新用户添加到在线用户列表 } privateIDuplexClientchannel(intid)//获取通道 { IDuplexClientclient=null; //确定接收人在线 if(onlineUser.Values.Where(f=>f._id==id).Count()>0) { returnonlineUser.Where(f=>f.Value._id==id).First().Key;//找到此通道 } returnclient; } }



参考文献:http://codeadmin.blog.163.com/blog/static/1158046532011626111624369/


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台