热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

XMPP(2)agsXMPP实现细节浅析

usingSystem;usingSystem.IO;usingSystem.Text;usingSystem.Threading;usingSystem.Net;usingSystem.Net.Sockets;usingagsXMPP.protocol;usingagsXMPP.protocol.iq;usingagsXMPP.protocol.iq.auth;usingagsXMPP.protocol.iq.roster;usin

using System; using System.IO; using System.Text; using System.Threading; using System.Net; using System.Net.Sockets; using agsXMPP.protocol; using agsXMPP.protocol.iq; using agsXMPP.protocol.iq.auth; using agsXMPP.protocol.iq.roster; usin

using System;

using System.IO;

using System.Text;

using System.Threading;

using System.Net;

using System.Net.Sockets;

using agsXMPP.protocol;

using agsXMPP.protocol.iq;

using agsXMPP.protocol.iq.auth;

using agsXMPP.protocol.iq.roster;

using agsXMPP.protocol.client;

using agsXMPP.Xml;

using agsXMPP.Xml.Dom;

namespace agsXMPP

{

///

/// Zusammenfassung f黵XMPPSeverConnection.

///

public class XmppSeverConnection

{

#region <>

public XmppSeverConnection()

{

streamParser = new StreamParser();

streamParser.OnStreamStart &#43;= new StreamHandler(streamParser_OnStreamStart);

streamParser.OnStreamEnd &#43;= new StreamHandler(streamParser_OnStreamEnd);

streamParser.OnStreamElement &#43;= new StreamHandler(streamParser_OnStreamElement);

}

public XmppSeverConnection(Socket sock) : this()

{

m_Sock = sock;

m_Sock.BeginReceive(buffer, 0, BUFFERSIZE, 0, new AsyncCallback(ReadCallback), null);

}

#endregion

private StreamParser streamParser;

private Socket m_Sock;

private const int BUFFERSIZE = 1024;

private byte[] buffer = new byte[BUFFERSIZE];

public void ReadCallback(IAsyncResult ar)

{

// Retrieve the state object and the handler socket

// from the asynchronous state object

// Read data from the client socket.

int bytesRead = m_Sock.EndReceive(ar);

if (bytesRead > 0)

{

streamParser.Push(buffer, 0, bytesRead);

// Not all data received. Get more.

m_Sock.BeginReceive(buffer, 0, BUFFERSIZE, 0, new AsyncCallback(ReadCallback), null);

}

else

{

m_Sock.Shutdown(SocketShutdown.Both);

m_Sock.Close();

}

}

private void Send(string data)

{

// Convert the string data to byte data using ASCII encoding.

byte[] byteData = Encoding.UTF8.GetBytes(data);

// Begin sending the data to the remote device.

m_Sock.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), null);

}

private void SendCallback(IAsyncResult ar)

{

try

{

// Complete sending the data to the remote device.

int bytesSent = m_Sock.EndSend(ar);

Console.WriteLine("Sent {0} bytes to client.", bytesSent);

}

catch (Exception e)

{

Console.WriteLine(e.ToString());

}

}

public void Stop()

{

Send("");

// client.Close();

// _TcpServer.Stop();

m_Sock.Shutdown(SocketShutdown.Both);

m_Sock.Close();

}

#region <>

// private int m_Port = 5222;

private string m_SessiOnId= null;

public string SessionId

{

get

{

return m_SessionId;

}

set

{

m_SessiOnId= value;

}

}

#endregion

private void streamParser_OnStreamStart(object sender, Node e)

{

SendOpenStream();

}

private void streamParser_OnStreamEnd(object sender, Node e)

{

}

private void streamParser_OnStreamElement(object sender, Node e)

{

Console.WriteLine("OnStreamElement: " &#43; e.ToString());

if (e.GetType() == typeof(Presence))

{

// route presences here and handle all subscription stuff

}

else if (e.GetType() == typeof(Message))

{

// route the messages here

}

else if (e.GetType() == typeof(IQ))

{

ProcessIQ(e as IQ);

}

}

private void ProcessIQ(IQ iq)

{

if(iq.Query.GetType() == typeof(Auth))

{

Auth auth = iq.Query as Auth;

switch(iq.Type)

{

case IqType.get:

iq.SwitchDirection();

iq.Type = IqType.result;

auth.AddChild(new Element("password"));

auth.AddChild(new Element("digest"));

Send(iq);

break;

case IqType.set:

// Here we should verify the authentication credentials

iq.SwitchDirection();

iq.Type = IqType.result;

iq.Query = null;

Send(iq);

break;

}

}

else if(iq.Query.GetType() == typeof(Roster))

{

ProcessRosterIQ(iq);

}

}

private void ProcessRosterIQ(IQ iq)

{

if (iq.Type == IqType.get)

{

// Send the roster

// we send a dummy roster here, you should retrieve it from a

// database or some kind of directory (LDAP, AD etc...)

iq.SwitchDirection();

iq.Type = IqType.result;

for (int i=1; i<11;i&#43;&#43;)

{

RosterItem ri = new RosterItem();

ri.Name = "Item " &#43; i.ToString();

ri.Subscription = SubscriptionType.both;

ri.Jid = new Jid("item" &#43; i.ToString() &#43; "@localhost");

ri.AddGroup("localhost");

iq.Query.AddChild(ri);

}

for (int i=1; i<11;i&#43;&#43;)

{

RosterItem ri = new RosterItem();

ri.Name = "Item JO " &#43; i.ToString();

ri.Subscription = SubscriptionType.both;

ri.Jid = new Jid("item" &#43; i.ToString() &#43; "@jabber.org");

ri.AddGroup("JO");

iq.Query.AddChild(ri);

}

Send(iq);

}

}

private void SendOpenStream()

{

// Recv:

// Send the Opening Strem to the client

string ServerDomain = "localhost";

this.SessiOnId= agsXMPP.SessionId.CreateNewId();

StringBuilder sb = new StringBuilder();

sb.Append( "" );

Send( sb.ToString() );

}

private void Send(Element el)

{

Send(el.ToString());

}

}

}

推荐阅读
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了在使用MSXML解析XML文件时出现DTD禁用问题的解决方案。通过代码示例和错误信息获取方法,解释了默认情况下DTD是禁用的,以及如何启用DTD的方法。此外,还提到了网上关于该问题的信息相对较少,因此本文提供了解决方案以供参考。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 本文是关于自学Android的笔记,包括查看类的源码的方法,活动注册的必要性以及布局练习的重要性。通过学习本文,读者可以了解到在自学Android过程中的一些关键点和注意事项。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 突破MIUI14限制,自定义胶囊图标、大图标样式,支持任意APP
    本文介绍了如何突破MIUI14的限制,实现自定义胶囊图标和大图标样式,并支持任意APP。需要一定的动手能力和主题设计师账号权限或者会主题pojie。详细步骤包括应用包名获取、素材制作和封包获取等。 ... [详细]
author-avatar
外事一棵葱_712
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有