我正在尝试使用XMPPFramework和OpenFire在iOS上通过XMPP传输文件。我的代码的基础来自以下tutorial。我有一个成功的TurnSocket(XEP-0065:SOCKS5字节流)连接,但是我无法工作如何使用它来发送数据。我有两个注意事项,我都坚持:1.调用[socket writeData]和2.使用“XEP-0096:SI文件传输”。

可能的解决方案1-调用[socket writeData]
在我的应用程序委托(delegate)中,我有一个didSucceed方法。我可以这样叫[socket writeData] ...

- (void)turnSocket:(TURNSocket *)sender didSucceed:(GCDAsyncSocket *)socket {

    NSLog(@"TURN Connection succeeded!");

    [socket writeData:myData withTimeout:60.0f tag:0];
    [turnSockets removeObject:sender];
}

6月14日更新:这是正确的吗?如果是这样,另一个用户如何读取数据?我已经尝试实现
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag

但它永远不会被调用。我如何确保它被调用?

可能的解决方案2-XEP-0096:SI文件传输
我是否需要使用XEP-0096:SI文件传输?如果是这样,如何在需要形成的XEP-0096 XML中使用成功的连接? XEP-0096 docs暗示有一个'hash'属性,但是我不知道它来自哪里。

例如
<iq type='set' id='offer1' to='[email protected]/resource'>
  <si xmlns='http://jabber.org/protocol/si'
      id='a0'
      mime-type='text/plain'
      profile='http://jabber.org/protocol/si/profile/file-transfer'>
    <file xmlns='http://jabber.org/protocol/si/profile/file-transfer'
          name='test.txt'
          size='1022'
          hash='552da749930852c69ae5d2141d3766b1'
          date='1969-07-21T02:56:15Z'>
      <desc>This is a test. If this were a real file...</desc>
    </file>
    <feature xmlns='http://jabber.org/protocol/feature-neg'>
      <x xmlns='jabber:x:data' type='form'>
        <field var='stream-method' type='list-single'>
          <option><value>http://jabber.org/protocol/bytestreams</value></option>
          <option><value>http://jabber.org/protocol/ibb</value></option>
        </field>
      </x>
    </feature>
  </si>
</iq>

最佳答案

将XEP-0096用于FileTransfer而不是XEP-0065,它仅适用于IOS,要成功进行传输,您需要接收方的当前资源ID(例如[email protected]/2526318749013466431),才能与代理IP和端口建立连接
jabber服务器的

关于xmpp - 如何使用TurnSocket(XEP-0065 : SOCKS5 Bytestreams) connection? XEP-0096 : SI File Transfer? [socket writeData]?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11018208/

10-12 14:20