【问题标题】:Disconnection of XMPP client while sending big size image, video and audio发送大尺寸图片、视频和音频时XMPP客户端断开连接
【发布时间】:2014-05-13 06:57:57
【问题描述】:

我已经使用 robbiehanson xmpp 示例实现了 xmpp。我可以聊天,也可以发送图像。我发送的图像被转换为​​ nsdata 并进一步转换为 Base64String,然后用

发送字符串

[self.xmppStream sendElement:message];

这样,如果图像的大小很小,我可以立即发送,但如果图像的大小更大,两个 xmpp 用户会断开连接并且文件不会传输。视频和音频也会发生同样的事情。虽然我可以使用压缩图像

UIImageJPEGRepresentation(image,0.005);

但是如何发送视频和音频的大小显然会很大。我已阅读有关 XEP - 0065 和 XEP - 0096 的文档,但无法以适当的方式实施。请让我知道为什么用户会断开连接,为什么我无法使用 base64 传输大量文件,并分享有助于我传输视频和音频的代码。

非常感谢您的帮助。

【问题讨论】:

    标签: ios video xmpp file-transfer xmppframework


    【解决方案1】:

    虽然 XMPP 允许传输少量二进制数据,但建议“带外”共享大文件或视频/音频流,并将 XMPP 用作signaling protocol - 你应该只发送 http:// 或 rtp: // 链接,您好友的客户端将下载它,或开始播放来自给定流的音频/视频。您可以以任何形式发送该链接,但有一些“标准草案”XMPP 扩展,允许与现有客户端兼容:

    1. XEP-0066: Out Of Band Data - 简单扩展,您只需将 URL 附加到标准 <message /> 元素。
    2. XEP-0095: Stream InitiationXEP-0166: Jingle - 这些是“元”规范,描述客户端如何“协商”他们支持的功能,选择共享数据的方式他们喜欢的方式(ibboobbytestreams,@987654328 @等),查找打开的TCP端口或中介代理,NAT穿越等。

    因此,如果您只想共享文件 - 通过任何现有的文件共享服务共享它并发送 URL,如第一个 XEP 中所述。如果您想构建大型服务或 VOIP 应用程序 - 使用 SI 或 Jingle。但是没有人阻止您创建自己的 XMPP 扩展,这可能更容易实现。 Here 是一个自定义的 XMPP 扩展,不是 XMPP 社区开发的,但被 XSF 接受为实验性的,你也可以检查一下。

    【讨论】:

    • 给我一个在xmpp中发送和接收音频和视频等文件的示例代码。试图搜索很多东西,但无法解决
    • 你好vitalyster你能提供发送和接收文件的示例代码吗?我有太多谷歌但找不到正确的东西。
    • 是否有任何机构有代码示例来发送或接收文件我面临 503 服务不可用的问题。如果您可以共享代码,那将非常有帮助。
    【解决方案2】:

    即使我没有将图像直接发送到 xmpp,因为这需要很多时间。

    在我的项目中,我的消息可以是字符串,也可以是图像,我发现只有一种方法可以发送消息,即。

    [xmppRoom sendMessageWithBody:@"Your msg"];
    

    所以对于发送图像,首先我将其转换为 base64,然后将其上传到我的服务器并从服务器获取该图像的 URL。一旦我们获得 URL,只需在上述方法中传递该 URL。

    我面临的问题是如何隔离普通消息和 URL(图片)

    因此,对于发送普通文本,我直接在上面的函数中发送它,但是对于发送 URL,我正在发送 nsdictionary,即我正在将 nsdictionary 转换为字符串并在上面的函数中发送

    NSDictionary *dict = @{@"type":@"image",
                                   @"url":@"Url of your image"};
    
                NSString *newMessage = [NSString stringWithFormat:@"%@",dict];
    
                [appDelegate.xmppRoom sendMessageWithBody:newMessage];
    

    用于隔离普通消息和图像 -

    - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message
    {
    
        messages *msg = [messages new];
    
         NSDictionary *dictOfMedia = [NSPropertyListSerialization
                                     propertyListWithData:[[[message elementForName:@"body"] stringValue] dataUsingEncoding:NSUTF8StringEncoding]
                                     options:kNilOptions
                                     format:NULL
                                     error:NULL];
    
        if ([dictOfMedia objectForKey:@"type"])
        {
            msg.mediaType = [dictOfMedia objectForKey:@"type"];
            msg.url = [dictOfMedia objectForKey:@"url"];
        }
        else
        {
            msg.msg = [[message elementForName:@"body"] stringValue];
        }
    
    
    }
    

    messages 是我的模型类,您可以简单地使用 nsstring 进行测试。

    之后,只需使用任何开源项目下载图像或自行执行延迟加载。

    希望对你有帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 2015-05-30
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多