学习一下基于XMPP协议的文件传输,首先假设用户已经登录,这里假设Clinet Send对Clinet Receive 发送文件,这里记录了Clinet Send的发送和接收XML流记录
1、发送请求表示要向Clinet test发送文件,并发送文件大小和文件名
SEND: <iq xmlns="jabber:client" id="agsXMPP_6" to="Receive @localhost/" type="set"><si xmlns="http://jabber.org/protocol/si" profile="http://jabber.org/protocol/si/profile/file-transfer" id="b3b5f49c-8a94-49e2-908a-3de694b98af0"><file xmlns="http://jabber.org/protocol/si/profile/file-transfer" name="MiniClient.exe.config" size="382"><range /></file><feature xmlns="http://jabber.org/protocol/feature-neg"><x xmlns="jabber:x:data" type="form"><field type="list-single" var="stream-method"><option><value>http://jabber.org/protocol/byReceive reams</value></option></field></x></feature></si></iq>
2、Receive 收到Send发实来的请求后,发送出响应流
RECV: <iq xmlns="jabber:client" to="Send@localhost" type="result" id="agsXMPP_6"><si xmlns="http://jabber.org/protocol/si" id="b3b5f49c-8a94-49e2-908a-3de694b98af0"><feature xmlns="http://jabber.org/protocol/feature-neg"><x xmlns="jabber:x:data" type="submit"><field var="stream-method"><value>http://jabber.org/protocol/byReceive reams</value></field></x></feature></si></iq>
3、Send收到Receive 愿意接收的响应后,发出如下XML流
SEND: <iq xmlns="jabber:client" id="agsXMPP_7" to="Receive@localhost" type="set"><query xmlns="http://jabber.org/protocol/bySendreams" sid="71f1b875-4d84-429c-b39d-7dabcd400f3d"><streamhost jid="Send@localhost/MiniClient" host="localhost" port="1000" /><streamhost jid="proxy.ag-software.de" host="proxy.ag-software.de" port="7777" /></query></iq>
注意这里注要是代理的设置,agsXMPP 自带的客户端是使用代理传输数据的,所以必须对其做相应的修改,使其支持局域网内支持发送文件.
下面我们来看一下服务器端是如何路由消息的呢?
从上面所发送的XML流我们可以看出,实际上用户传送文件所发送的都是IQ节,我们必须对IQ节进行路由才能使其找到相应的接收者 ,所以我们需要在XmppServerConnection类中添加如下代码:
private void ProcessIQ(IQ iq)
{
//传送文件得理
if (iq.Query == null)
{
if(iq.Type == IqType.result)
this.Send(iq);
ProcessOobIQ(iq);
}
else
if (iq.Query.GetType() == typeof(Auth))
{
Auth auth = iq.Query as Auth;
this.Username = auth.Username.ToString();
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
if (AccountBus.CheckLogin(auth.Username, auth.Digest, this.SessionId))
{
iq.SwitchDirection();
iq.Type = IqType.result;
iq.Query = null;
Send(iq);
Console.WriteLine(auth.Username + "登录了" + " 登录时间:" + System.DateTime.Now.ToString());
}
else
{
// iq.SwitchDirection();
iq.Type = IqType.error;
iq.Query = null;
Send(iq);
}
break;
}
}
else if (iq.Query.GetType() == typeof(Roster))
{
ProcessRosterIQ(iq);
}//用代理传送文件处理
else if(iq.Query.FirstChild !=null)
{
// iq.SwitchDirection();
// //iq.Type = IqType.result;
// //Send(iq);
// iq.Type = IqType.set;
//this.Send(iq);
ProcessOobIQ(iq);
}
}
传送文件载图:
- 大小: 85.3 KB
分享到:
相关推荐
基于XMPP协议的手机多方多端即时通讯方案,包括详细的介绍和解决方案
net平台 基于 XMPP协议的即时消息服务端简单实现
xmpp协议的服务器端安装文件openfire
基于XMPP协议的手机多方多端即时通讯方案
初步学习XMPP协议,并完成了一个基于XMPP的简单即时通信Demo。
基于xmpp协议的多端即时通讯:很详细的介绍,希望可以帮到大家.
基于XMPP协议的WEBIM 简单实现,如有开发openfire+spark/jwchat的可以参考
基于Xmpp协议即时通讯服务器架设及客户端设计 服务器端软件 ejabberd 2.1.6 apache2.2 mysql 安装配置 客户端 strophe(javascript linux下min编译) gloox(c++)库 资料及示例源码
XMPP协议及其服务器端的Openfire插件开发XMPP背景知识XMPP是一种基于XML的协议,它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。绊过扩展以后的XMPP可以通过发送扩展的信息来处理用户的...
本文介绍了一种基于XMPP 协议的AndroidPn 开源框架的实现模型,将其部署在MySQL 数据库和Tomcat 服务器下,实现并改进了实时推送消息、自定义消息结构和内容、推送服务开机启动、手机端服务唤醒、发送离线消息等实用...
基于XMPP协议的消息推送 (内含有服务器和客户端源码)简单
XMPP是一种用于即时消息、出席和请求响应服务的开放性XML协议,具有很强的开放性、安全性和可扩展性。本文详细阐述了移动互联网中三种推送技术的原理,通过对它们优缺点和...提出了客户端与服务器端的设计与实现方案。
基于)m但P协议的文件传输也是基于Ⅺv儿流的传输方 式传输数据,为以后不同风格代码和外来模块的加入打下了良好的基础,提高了扩展能力,可集成于基于舭数据处理的 应用系统中。由于该模块是用Java编写可在不同的操作...
基于XMPP协议的类似QQ的即时通信demo 简单实现了 注册,登录,添加好友,删除好友,好友的通信 包括发文本,图片和声音。
web端页面做IM聊天室功能,所以我们选择在web页面上直接与openfire做通信,这样可以减少服务器访问压力.web页面端通过应用strophe.js库,拼接XMPP字符串与openfire服务器进行通信
基于XMPP协议的即时通信系统服务器集群的研究,陈武,杨世达,本文描述了在实现基于xmpp协议的即时通信系统的服务器集群时遇到的关键性问题,从安全、性能和通用性方面考虑提出了解决方案,重��
Android 基于XMPP协议IM聊天实现(客户端+服务端) 源码
Android 基于xmpp协议,smack包,openfire服务端的高仿QQ的即时通讯实现.zip
基于XMPP协议的智能家居环境监测系统设计与实现.pdf
Android基于XMPP协议的数据推送技术 Android基于XMPP协议的数据推送技术