Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 移动提供商无法使用UDP打孔_Java_Android_Udp_Protocols - Fatal编程技术网

Java 移动提供商无法使用UDP打孔

Java 移动提供商无法使用UDP打孔,java,android,udp,protocols,Java,Android,Udp,Protocols,实际上,我正在编写一个android应用程序,它接收连接到pc的网络摄像头的图片。为了获得更多fps,我使用udp协议而不是tcp。这个想法是,pc将图片发送到手机的ip和端口。但手机供应商有不同的公共端口。所以我不能直接接电话。这就是为什么我试图通过udp打孔来解决这个问题,但没有成功。当我的手机向pc发送一个数据包时,pc将获得手机的公共ip和端口。这种情况每秒钟都会发生,以保持会议的开放性。然后服务器尽可能快地将网络摄像机帧发送到此ip和端口。但手机仅在1-2秒内接收10-15张图片。在这

实际上,我正在编写一个android应用程序,它接收连接到pc的网络摄像头的图片。为了获得更多fps,我使用udp协议而不是tcp。这个想法是,pc将图片发送到手机的ip和端口。但手机供应商有不同的公共端口。所以我不能直接接电话。这就是为什么我试图通过udp打孔来解决这个问题,但没有成功。当我的手机向pc发送一个数据包时,pc将获得手机的公共ip和端口。这种情况每秒钟都会发生,以保持会议的开放性。然后服务器尽可能快地将网络摄像机帧发送到此ip和端口。但手机仅在1-2秒内接收10-15张图片。在这之后,提供商似乎会过滤每一个后续数据包或类似的内容,因为手机不会再收到任何数据包


现在我的问题是:发生了什么(或者提供商正在做什么)以及如何解决这个问题?TCP协议工作正常,但流传输速度太慢,因为开销和错误更正太多。

UDP有几个问题需要记住,这些问题在移动网络上被放大了:

  • 正如您可能知道的,一旦发送UDP数据报,就绝对不能保证它会通过,也无法确定如果它没有通过,会发生什么

  • 超过大约1400字节的有效负载可能会被分解为IP片段。接收操作系统可以将它们重新组装成一个完整的数据包,但前提是每个片段都到达。有些路由器会任意丢弃碎片,有些防火墙会丢弃包含特定字节模式的碎片,有些路由器会限制碎片的发送速率。最好始终保持数据报较小,自己处理重新组装和丢失片段的重复

  • 没有流量控制:如果任何路由器的缓冲区已满,则之后的所有内容都将被丢弃。一些路由器将开始随机丢弃一定百分比的数据包,如果它们的缓冲区正在增长但尚未满。如果UDP源的速度超过任意阈值,则某些防火墙会将其列入黑名单


一般来说,设备和防火墙制造商倾向于将UDP视为垃圾,因此作为UDP开发人员,你必须是一个非常好的公民,才能不被抛弃:调节流量,记住丢弃的数据包意味着你可能走得太快,并保持数据包的小。在受控环境中,您可以避免很多问题,但如果应用程序将“在野外”部署,则需要进行大量仔细的编程以避免出现问题。

它们大约有20k。但我已经找到了原因:我在太短的时间范围内发送了太多的数据包。由于设备无法足够快地处理它们,它们已存储在设备的网络堆栈中的某个位置。现在我在每个数据包之间等待75毫秒,它就像一个charm=)@Dano,如果你找到了解决方案,请编辑你的答案或回答你自己的问题。请。