【发布时间】:2019-02-14 16:57:48
【问题描述】:
首先我要介绍一下情况:我创建了一个在两个 Android 设备之间发送视频和音频的应用程序(客户端和服务器之间的直接连接)。现在我想更进一步,使用在计算机中运行的专用 Java 服务器;该服务器必须桥接这些客户端和服务器应用程序之间的流量。例如,首先两个android应用程序都会连接到计算机服务器,然后将从第一台设备获取的所有视频数据发送到服务器,然后发送到第二台设备。
快速的答案可能是:在服务器内部,为每个现有的套接字创建两个套接字,然后使用它们来桥接数据。 问题是我有 5 个 UDP 套接字:客户端的音频 Tx 和 Rx、视频 Tx 和 Rx 和 Orders Tx,以及服务器端的音频 Tx 和 Rx、视频 Tx 和 Rx 和 Orders Rx,我还有一个TCP Socket 来管理通信。
所以此时我唯一的选择是:
客户端APP-----------计算机服务器-------------服务器APP
音频发送 --------------> 音频接收 |音频发送 -------------> 音频接收
音频接收
视频发送 --------------> 视频接收 |视频发送 ------------> 视频接收
视频接收
订单发送 ----------> 订单接收 |订单 Tx -----------------------> 订单 Rx
TCP TCP | TCP TCP
管理/编码/维护绝对是地狱。
第二种选择是使用NIO,但是在发送大量数据时不推荐使用。
这是最好的方法吗?如果没有,有什么办法可以减少服务器中 UDP 套接字的数量,因为它们只会在两个设备之间桥接数据?
感谢您的宝贵时间!
【问题讨论】:
-
首先:我对UDP一无所知。但是在第一行看到
Computer server的是-->Audio Rx | Audio Tx -->。那是对的吗?我会认为更像“-->Audio Tx | Audio Tx -->”。我想没有计算机服务器的连接将是“Audio Tx --> Audio Tx”? -
所以 T 是发送器/发送器,R 是接收器?
-
但是您的计算机服务器中需要那么多不同的 R/T 套接字吗?中继音频与视频或命令不同吗?服务器除了转发传入的数据包外别无他法。所以在我看来,你只需要编写一个 RTmodule。然后为您的 5 个流实例化 5 次。
-
这是选项之一,当然我可以创建一个 UDPDataBridge 类,该类运行一个包含两个 UDP 套接字的线程,一个用于 Rx,另一个用于 Tx,然后使用此类的多个实例来执行技巧,但我想知道比这更简单的东西,因为唯一的任务是重新发送数据包。到目前为止,我会坚持这个想法,谢谢!