Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.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
javascript聊天客户端的服务器轮询间隔_Javascript_Ajax - Fatal编程技术网

javascript聊天客户端的服务器轮询间隔

javascript聊天客户端的服务器轮询间隔,javascript,ajax,Javascript,Ajax,我正在为我的网站构建一个基本的AJAX shoutbox/chat,但我不确定如何实现服务器轮询 以下是我想到的基本程序流程: 用户来到页面并显示最后10条消息 为了获取其他人发送的消息,客户端javascript将请求一个带有时间戳参数的URL(设置为客户端收到的最后一条消息的值) 服务器返回自该时间戳以来的所有消息(最多10条) 唯一的问题是轮询服务器的频率。显然,它应该在每次添加新邮件时进行轮询,但当您只是在阅读其他邮件时,它需要自动更新 是否应该设定一个时间限制?每10秒。或者,是否应根

我正在为我的网站构建一个基本的AJAX shoutbox/chat,但我不确定如何实现服务器轮询

以下是我想到的基本程序流程:

  • 用户来到页面并显示最后10条消息
  • 为了获取其他人发送的消息,客户端javascript将请求一个带有时间戳参数的URL(设置为客户端收到的最后一条消息的值)
  • 服务器返回自该时间戳以来的所有消息(最多10条)
  • 唯一的问题是轮询服务器的频率。显然,它应该在每次添加新邮件时进行轮询,但当您只是在阅读其他邮件时,它需要自动更新

    是否应该设定一个时间限制?每10秒。或者,是否应根据使用情况而有所不同?5秒钟后检查。如果没有消息,请不要再检查10秒钟。如果仍然没有新消息,请检查15秒,然后检查20秒,最多每30秒检查一次。每次检测到新消息时,请将计时器重置为5秒,然后重新启动

    我只是担心给服务器带来不必要的压力,因为我们可能会有数百个用户同时在线


    …还是我把整个事情搞错了?有没有更好的方法来实现基本的javascript聊天?

    您应该每隔5秒左右检查一次其他用户是否正在键入,如果其他用户正在键入,那么您可以每1秒检查一次,查看该用户是否发送了新消息。实际上,您应该能够每1秒检查一次其他用户是否正在键入,然后每隔.25到.5秒检查一次是否已发送新消息。随着宽带在inet上的广泛接受,这不应该是一个问题。使用较长的轮询超时进行拨号访问。

    您可能希望研究所谓的编程技术,将信息流式传输给用户,而不是让客户端轮询服务器。这实际上是一系列技术,其中一些技术可能比其他技术更好,具体取决于环境,例如您使用的是哪种服务器以及您需要哪种客户端兼容性


    如果您的服务器一次可以处理大量打开的连接(如中所示,它不会对每个连接使用整个线程或进程,例如,或基于服务器的连接),则您可能希望使用长轮询技术,在这种情况下,一旦收到一条消息,客户端就会立即请求另一条消息。如果没有可用的消息,服务器只会保持连接打开,可能会偶尔发送虚假数据作为保留,直到消息可用。

    这是一个非常困难的问题,请记住滥用。恶意用户会尽可能频繁地攻击您,伪造最早的时间戳,从而对您的DB服务器造成压力。一定要验证时间戳,或者忽略它,因为每个人都不应该在同一时间吗


    您可以根据其他用户的响应时间向用户发送轮询间隔。我认为这是最好的动态方式。

    Brian描述的Comet是一种很好的技术,但需要服务器上的会话支持,这可能比您想要为一个简单的聊天盒实现的更高级

    实现轮询间隔的最佳方法是想象您有一个聊天窗口,您可以最小化该窗口来做其他事情,或者打开它查看是否有新消息。当你处于谈话的中间时,你会经常切换到它。如果你有一段时间没有收到任何消息,你会开始变得越来越稀罕,直到你只是偶尔检查一下


    假设您不需要进行实时输入,您可能可以在活动高峰时每3秒左右进行一次轮询,如果5-10次轮询没有显示任何内容,则开始将时间间隔调高(可能每次加倍),直到达到30-60秒。回复消息应将轮询间隔重置为几秒钟,而发送消息应立即轮询,但可能不需要影响轮询频率。

    老实说,如果您正在实现一个“基本的AJAX shoutbox/chat”,像等事情对您来说太过分了。这些事情将需要您运行额外的 服务器/代理承担应用服务器和数据库的负载。
    当你想到“乔在打字…”之类的东西时,你的应用程序就会变得过于复杂(考虑到“聊天”不是你的主要关注点)。
    考虑添加来自和等提供商的小部件。一旦你开始思考喋喋不休之类的话……


    这是一个免费的基于comet的聊天服务,由开发jmvc框架的人提供。还没有尝试过,但看起来很有希望。

    专业的做法是使用WebSocket javascript连接。例如,您可以使用免费服务,并使用

    //创建WebSocket连接。
    常量套接字=新的WebSocket('wss://socketsbay.com/wss/v2/[ChannelId]/[ApiKey]/');
    //连接已打开
    socket.addEventListener('open',函数(事件){
    send('Hello Server!');
    });
    //听消息
    socket.addEventListener('message',函数(事件){
    console.log('来自服务器的消息',event.data);
    
    });是的,我想到了这一点-我想我会返回给定时间戳后的最近10条消息,因此即使有人将其更改为“0”,他们也只会得到最后10条消息。不要使用时间戳,而是向客户端发出令牌,这样您就可以首先用令牌为他们标记消息,当他们请求这些邮件时,您会创建一个新的令牌返回给他们,并用最新的令牌标记新邮件。不过可能会有数百人。这难道不要求每个客户机在用户开始键入时以及停止键入时发送请求吗?这是事实,但是在AJAX中,AJAX XMLHTTPReq就是这样做的