silverlight中Wcf双工通信

silverlight中Wcf双工通信,第1张

概述一.创建WCF应用程序        接口文件:   [ServiceContract(Namespace = "Silverlight", CallbackContract = typeof(IDuplexClient))]       public interface IDuplexService       {            /// 

一.创建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 { getset; }              [DataMember]             public   string _@R_502_6889@ { getset; }          }    

 二. 实现接口

 

  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双工通信所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1019342.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存