锁定老帖子 主题:基于 XMPP协议的即时消息服务端简单实现
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-27
服务器端XmppSeverConnection类事件
/// <summary> /// 处理IQ节的杂项数据. /// </summary> /// <param name="iq">The iq.</param> private void ProcessRosterIQ(IQ iq) { if (iq.Type == IqType.get) { // 发送IQ节的杂项数据 //这里我用来下载好友列表 iq.SwitchDirection(); iq.Type = IqType.result; List<string> friendList = new List<string>(); friendList = AccountBus.GetFriendName(this.username); foreach (string str in friendList) { RosterItem ri = new RosterItem(); ri.Name = str.Trim(); ri.Subscription = SubscriptionType.both; ri.Jid = new agsXMPP.Jid(str.Trim() + "@localhost"); ri.AddGroup("localhost"); iq.Query.AddChild(ri); } Send(iq); } } 服务器端开启监听5222端口
如果收到客户端请求就异步调用AcceptCallback初始化套接字连接 public XmppSeverConnection(Socket sock) : this() { m_Sock = sock; m_Sock.BeginReceive(buffer, 0, BUFFERSIZE, 0, new AsyncCallback(ReadCallback), null); m_Sock.SendTimeout = 100; }
客户端与服务器端的交互过程
<stream:stream to='localhost' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' xml:lang='en'> 2服务器端收到请求,初始化回应流,并随机生成一相SessionID <stream:stream xmlns:stream="http://etherx.jabber.org/streams" from="localhost" id="30e3b8c0" > 3等待服务器返回消息后客户端发送用户名(由于在客户端采用了异步调用 <iq xmlns="jabber:client" id="agsXMPP_1" type="get" to="localhost"> 4服务器端收到用户名等待用户提供密码 <iq xmlns="jabber:client" from="localhost" type="result" id="agsXMPP_1"> 5客户端提供加密后的密码 <iq xmlns="jabber:client" id="agsXMPP_2" to="localhost" type="set"> 6服务器端从数据库验证用户名和密码,并返回结果 iq xmlns="jabber:client" from="localhost" type="result" id="agsXMPP_2" /> 7如果返回错误,客户端提示并终断连接,否则客户端发送响应数据 8 服务器端返回数据 9 客户端发送状态, 10服务器收到状态,发送IQ节并通知其它用户. 项目解决方案和类图 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-03-15
你为什么要抄agsXMPP的示例代码呢,写点自己的东西才好.
|
|
返回顶楼 | |
浏览 4244 次