Chrome在一定数量的数据传输后挂起 – 等待可用套接字
我有一个浏览器游戏,我最近开始添加audio到游戏中。
Chrome浏览器并没有加载整个页面,并在"91 requests | 8.1 MB transferred"
卡住,并且不会加载任何更多的内容,甚至在所有其他标签中显示Waiting for available socket
。
5分钟后(正好)数据被加载。
这在任何其他浏览器上都不会发生。
删除一个MP3文件(最新添加的一个)修复了这个问题,所以我猜想它的一个数据限制问题?
看起来你是按每个服务器的限制连接。 我看到你正在加载大量的静态文件,我的build议是将它们分开在一个子域中,并用Nginx直接提供。
-
创build一个名为img.yoursite.com的子域,并从那里加载所有图像。
-
创build一个名为scripts.yourdomain.com的子域,并从那里加载所有的JS和CSS文件。
-
创build一个名为sounds.yoursite.com的子域,并从那里加载所有的MP3 …等等。
Nginx具有直接提供静态文件和pipe理静态文件caching的好select。
说明:
发生此问题是因为默认情况下,Chrome最多允许6个打开的连接。 所以,举个例子来说,如果你从6个<video>
或者<audio>
标签中同时传输多个媒体文件,那么第7个连接(例如图像)就会挂起,直到其中一个sockets打开。 通常情况下,一个打开的连接将在5分钟不活动后closures,这就是为什么你看到你的PNG终于在这一点上加载。
解决scheme1:
您可以通过最小化保持打开连接的媒体标记的数量来避免这种情况。 如果您需要超过6个,请确保最后加载它们,或者它们没有像preload="auto"
这样的属性。
解决scheme2:
如果您想要在网页游戏中使用多种声音效果,我强烈build议您使用SoundJS。这是一个用于同时播放大量声音效果/音乐曲目的好工具。
解决scheme3:强制打开套接字 (不推荐)
如果必须,您可以强制打开浏览器中的套接字(仅限Chrome):
- 转到地址栏并input
chrome://net-internals
。 - 在下拉菜单中,select
Sockets
。 - 点击
Flush socket pools
button。
不build议使用此解决scheme,因为您不应该指望访问者按照这些说明来查看您的网站。
消息:
等待可用的套接字…
因为你已经达到了每个主机,代理或者组的ssl_socket_pool的限制。
以下是您可以使用Chrome浏览器进行的HTTP连接的最大数量:
- 每个代理的最大连接数是32个连接。 这可以在Policy List中更改。
-
每个主机的最大数量:6个连接
这可能是硬编码的网页浏览器的源代码,所以你不能改变它。
-
每个浏览器共有256个HTTP连接。
来源: Chrome设备的企业networking
上述限制可以在chrome://net-internals/#sockets
(或者在chrome://net-internals/#events&q=type:SOCKET%20is:active
)中实时检查或刷新。
您的audio问题可能与Chrome的缺陷162627有关 ,HTML5audio无法加载,并且每个服务器的代理服务器同时访问的连接数最高。 在撰写本文时(2016年),这仍然是一个活跃的问题。
与HTML5video请求相关的许多旧问题仍然未决 ,则可能与2014年已修复的问题#234779有关。与SPDY相关的问题可以在问题324653中find:SPDY问题:正在等待可用套接字 ,但已经修复在2014年,所以可能是没有关系的。
现在标记为重复的其他相关问题可以在问题401845中find:未预先加载audio元数据。 只装载了10个中的6个,这与媒体播放器代码的问题相关,留下了一堆暂停的请求。
这也可能与某些Chrome广告软件或在背景中使用套接字的防病毒扩展(如Sophos或Kaspersky )相关,因此请检查DevTools中的 networking活动。
简单而正确的解决scheme是推迟预载你的audio和video文件的设置和重新检查你的页面等待可用套接字的问题将解决… … –
如果您使用jplayer然后replacepreload:“元数据” 预加载:“无”从jplayer JS文件…
预加载:“元数据”是在页面加载播放您的audio/video文件的默认值这就是为什么谷歌铬显示“等待可用套接字”错误