4

我是套接字编程的新手,对它的工作原理不太了解,这是用例,我正在开发一个 iPhone 应用程序,用户在其中流式传输来自另一台 iPhone 设备的实时音频(简而言之,多播)

到目前为止我做了什么:

我在服务器上打开了一个端口,它一直在监听来自客户端的传入数据。在 iOS 端,我实现了读取服务器上接收到的数据包并进行相应处理的方法(我使用了 GCDAsyncSocket)

我需要帮助的问题:

上述用例非常适合 2 个用户,一个将音频数据发送到服务器,另一个读取该数据以播放音频。但实际上并不总是有一个用户发起音频数据,他们可能超过 100 多个,现在当他们都向服务器发送不同的音频数据时,我如何为每个人只接收数据的听众过滤数据,我克服这个问题,在每个数据包上添加一个令牌,比如

unique_token:<ffdefa09 fedead3...... //Audio Data

但是这个过程太慢了,因为每个客户端都在监听所有的数据包,并且只处理带有分配令牌的数据包。

无论如何,我们可以建立点对点连接,通过该连接,源设备成为服务器,只向其侦听器发送数据,而不打扰其他人?

4

3 回答 3

1

在开始将音频数据发送到服务器之前,您不能添加诸如轻协议之类的东西吗?

iPhone -> server [Request: Start Stream Audio]
server -> iPhone [OK: TCP Port:4444]
// iphone sending audio packets to port 4444


iPhone2 -> server [Request: Start Stream Audio]
server -> iPhone2 [OK: TCP Port:4445]

然后服务器可以使用 TCP 端口 ID 而不是数据包 ID 过滤所有音频通道(或者我可能误解了你的问题)

顺便说一句,由于提供商防火墙,我认为您无法在蜂窝网络上使用 iPhone 进行任何“真正的”P2P

于 2013-10-23T13:47:52.430 回答
1

对于发送音频数据的每一端,您创建一个套接字并接收音频数据,对于接收音频数据的每一端,您创建一个套接字并发送音频数据。P2P 的工作量很大,因为很多设备都在公共地址后面。

于 2013-10-29T10:02:49.200 回答
1

您需要将命令数据与流/音频数据分开。

首先,您需要 iphone 告诉服务器他们想要什么,

  • iphone 1:“我想用 id 1 流式传输这些数据”
  • iphone 2:“我想用 id 1 收听流媒体”

这样服务器就可以告诉 iphone 连接到哪里来获取它需要的数据,正如 HaneTV 建议的端口号

于 2013-10-30T06:54:50.480 回答