一.创建WCF应用程序
接口文件:
[ServiceContract(@R_502_6889@space = "Silverlight", CallbackContract = typeof(IDuplexClIEnt))] public interface IDuplexService { /// <summary> /// 登陆的时候调用 /// </summary> /// <param @R_502_6889@="@R_502_6889@">名字</param> /// <param @R_502_6889@="quantity">ID</param> [OperationContract(IsOneWay = true)] voID Login(string @R_502_6889@, int ID); /// <summary> /// 发送消息 /// </summary> /// <param @R_502_6889@="message">消息内容</param> /// <param @R_502_6889@="ID">大于0为私聊</param> /// <param @R_502_6889@="ID">自己的ID</param> [OperationContract(IsOneWay = true)] voID Say(string message, int ID,int uID); } ///客服端调用 //[ServiceContract] public interface IDuplexClIEnt { //返回登陆人员 [OperationContract(IsOneWay = true)] voID rFrIEndList(List<UserInfo> frIEndList); /// <summary> /// 系统消息 /// </summary> /// <param @R_502_6889@="message">返回消息</param> /// <param @R_502_6889@="type">0代表异地登陆,-1代表用户异常,-2用户上线,-3用户下线</param> [OperationContract(IsOneWay = true)] voID rSysMessage(string message, int type,int ID); } //封装要传送的数据 [DataContract] public class UserInfo { public UserInfo(string @R_502_6889@,int ID) { _ID = ID; _@R_502_6889@ = @R_502_6889@; } [DataMember] public int _ID { get; set; } [DataMember] public string _@R_502_6889@ { get; set; } }
二. 实现接口
public class OrderService : IDuplexService { IDuplexClIEnt clIEnt = OperationContext.Current.GetCallbackChannel<IDuplexClIEnt>();//构建用户通道 List<UserInfo> lst = new List<UserInfo>();//存放登录用户 private static Dictionary<IDuplexClIEnt, UserInfo> onlineUser = new Dictionary<IDuplexClIEnt, UserInfo>();//用每个用户通道和用户信息组成字典存储当前用户列表 #region IDuplexService 成员 public voID Login(string @R_502_6889@, int ID) { //判断是否已经登陆 if (onlineUser.Values.Where(h => h._@R_502_6889@ == @R_502_6889@).Count() > 0) { IDuplexClIEnt repertClIEnt = onlineUser.Where(f => f.Value._@R_502_6889@ == @R_502_6889@).First().Key; //返回给此客户端重复登陆信息,强迫其下线 onlineUser.Remove(repertClIEnt); repertClIEnt.rSysMessage("帐号在异地登录,被迫下线。", -1,0); //通知好友你上线了 foreach (var ou in onlineUser) { ou.Key.rSysMessage(@R_502_6889@ + ":下线了", -3, ID);//回调接收方 } } loginChat(@R_502_6889@, ID); } public voID Say(string message,int uID) { IDuplexClIEnt clIEnt = null; if (ID == 0)//群聊 { foreach (var ou in onlineUser) { ou.Key.rSysMessage(message, ID, uID);//回调接收方 } } else { clIEnt = channel(ID);//获取接收方通道 if (clIEnt != null)//如果接收方在线 { clIEnt.rSysMessage(message, uID);//回调接收方 } } } #endregion public voID loginChat(string user@R_502_6889@, int ID)//登陆聊天模块 { lst.Add(new UserInfo(user@R_502_6889@, ID)); clIEnt.rFrIEndList(lst);//返回好友列表 //通知好友你上线了 foreach (var ou in onlineUser) { ou.Key.rSysMessage(user@R_502_6889@ + ":上线了", -2, ID);//回调接收方 } onlineUser.Add(clIEnt, new UserInfo(user@R_502_6889@, ID));//新用户添加到在线用户列表 } private IDuplexClIEnt channel(int ID)//获取通道 { IDuplexClIEnt clIEnt = null; //确定接收人在线 if (onlineUser.Values.Where(f => f._ID == ID).Count() > 0) { return onlineUser.Where(f => f.Value._ID == ID).First().Key;//找到此通道 } return clIEnt; } }
参考文献:http://codeadmin.blog.163.com/blog/static/1158046532011626111624369/
总结以上是内存溢出为你收集整理的silverlight中Wcf双工通信全部内容,希望文章能够帮你解决silverlight中Wcf双工通信所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)