一.创建WCF应用程序
接口文件:
[ServiceContract(namespace = "Silverlight", CallbackContract = typeof(IDuplexClIEnt))] public interface IDuplexService { /// <summary> /// 登陆的时候调用 /// </summary> /// <param name="name">名字</param> /// <param name="quantity">ID</param> [OperationContract(IsOneWay = true)] voID Login(string name, int ID); /// <summary> /// 发送消息 /// </summary> /// <param name="message">消息内容</param> /// <param name="ID">大于0为私聊</param> /// <param name="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 name="message">返回消息</param> /// <param name="type">0代表异地登陆,-1代表用户异常,-2用户上线,-3用户下线</param> [OperationContract(IsOneWay = true)] voID rSysMessage(string message, int type,int ID); } //封装要传送的数据 [DataContract] public class UserInfo { public UserInfo(string name,int ID) { _ID = ID; _name = name; } [DataMember] public int _ID { get; set; } [DataMember] public string _name { 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 name, int ID) { //判断是否已经登陆 if (onlineUser.Values.Where(h => h._name == name).Count() > 0) { IDuplexClIEnt repertClIEnt = onlineUser.Where(f => f.Value._name == name).First().Key; //返回给此客户端重复登陆信息,强迫其下线 onlineUser.Remove(repertClIEnt); repertClIEnt.rSysMessage("帐号在异地登录,被迫下线。", -1,0); //通知好友你上线了 foreach (var ou in onlineUser) { ou.Key.rSysMessage(name + ":下线了", -3, ID);//回调接收方 } } loginChat(name, 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 username, int ID)//登陆聊天模块 { lst.Add(new UserInfo(username, ID)); clIEnt.rFrIEndList(lst);//返回好友列表 //通知好友你上线了 foreach (var ou in onlineUser) { ou.Key.rSysMessage(username + ":上线了", -2, ID);//回调接收方 } onlineUser.Add(clIEnt, new UserInfo(username, 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条)