Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.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 使用WebSocket时消息被延迟 我有一个程序,使用的是强> WebStutabuttPc>/Stult>:客户端是Chrome的扩展,服务器是用C++编写的应用程序。 当我从客户端向服务器发送小数据时,它工作正常。但是,当我发送大量数据(例如源html页面)时,它会稍微延迟_Javascript_C++_Sockets_Websocket - Fatal编程技术网

Javascript 使用WebSocket时消息被延迟 我有一个程序,使用的是强> WebStutabuttPc>/Stult>:客户端是Chrome的扩展,服务器是用C++编写的应用程序。 当我从客户端向服务器发送小数据时,它工作正常。但是,当我发送大量数据(例如源html页面)时,它会稍微延迟

Javascript 使用WebSocket时消息被延迟 我有一个程序,使用的是强> WebStutabuttPc>/Stult>:客户端是Chrome的扩展,服务器是用C++编写的应用程序。 当我从客户端向服务器发送小数据时,它工作正常。但是,当我发送大量数据(例如源html页面)时,它会稍微延迟,javascript,c++,sockets,websocket,Javascript,C++,Sockets,Websocket,例如: 客户端发送:1,2,3 服务器接收:1,2 客户端发送:4 服务器接收:3 客户端发送:5 服务器接收:4 看来是耽搁了 这是我的代码客户端: var m_cWebsocket=newWebSocket(“服务器名”); 如果(m_cWebsocket==null){return false;} m_cWebsocket.onopen=onWebsocketOpen(m_cWebsocket);m_cWebsocket.onmessage=onWebsocketMess

例如:

  • 客户端发送:1,2,3
    • 服务器接收:1,2
  • 客户端发送:4
    • 服务器接收:3
  • 客户端发送:5
    • 服务器接收:4
看来是耽搁了

  • 这是我的代码客户端:
  • var m_cWebsocket=newWebSocket(“服务器名”);
    如果(m_cWebsocket==null){return false;}
    m_cWebsocket.onopen=onWebsocketOpen(m_cWebsocket);m_cWebsocket.onmessage=onWebsocketMessage;
    m_cWebsocket.onerror=onWebsocketError;
    m_cWebsocket.onclose=onWebsocketError;
    
    我使用m_cWebsocket.send(strMsg)发送数据因为您还没有发布任何代码来显示您的TCP服务器或客户端的实现,所以我只能推测并尝试解释这里可能发生的情况

    这意味着我在下面概述的潜在问题和解决方案可能适用于您,也可能不适用于您,但无论如何,这些信息对将来可能发现此问题的其他人仍然有帮助


    TL;DR:(很可能)要么是服务器速度太慢,要么是服务器没有正确地等待完整的“tcp数据包”进行缓冲,要么是服务器不知道何时正确启动和停止,并且在等待缓冲区大小等定义的它认为是“完整数据包”的数据时正在取消同步

    在我看来,您从客户端推送数据的速度可能快于服务器可以读取的速度,或者更可能的情况是,服务器正在缓冲当前
    TCP流中的一组字节,并等待缓冲区填满后再输出其他数据

    如果您将此代码发送到代码>本地主机< /COD>,您不太可能接近流的限制,并且我希望用C++编写的服务器能够跟上JavaScript客户端。p> <>这使我相信这个问题实际上是C++侧的流缓冲区。 现在,由于服务器无法知道您正在发送什么数据,或者发送多少数据,TCP流通常使用流缓冲区,该缓冲区从套接字连续读取数据,直到缓冲区填充到已知大小,或者直到它看到预定义的“停止字符”。这通常类似于“行尾”或

    \n
    字符,有时是
    \n\r
    (换行符、回车符),具体取决于您的操作系统

    因为您没有指定如何接收数据,所以我假设您创建了一个特定大小的
    char
    byte
    缓冲区。我对C++的套接字信息非常生疏,所以我可能错了,但是我相信C++上的TCP流也有默认的“读取超时”。 这意味着您可能会遇到2个问题中的1个

    情况1)在输出数据之前,您正在等待该
    字节
    /
    字符
    缓冲区被填满。问题是,这将像一辆公共汽车,只有当所有座位都坐满时才离开车站。如果您没有填满所有的座位,您的服务器只是坐着等待,直到它得到更多的数据来完全填满并输出您的数据

    情况2)您遇到套接字读取超时,因此函数在输出数据之前没有获取所有数据。这就像一辆按时钟运行的公共汽车。每10分钟一班公共汽车离开车站,不管那辆公共汽车是满的还是空的,它都会离开,下一班公共汽车会接任何迟到的人。在您的情况下,TCP流无法足够快地将
    1、2和3
    加载到总线上,因此总线离开时只有
    1、2
    ,因为在20毫秒没有接收数据之后,服务器正在退出函数并输出数据。然而,在下一个循环中,有
    3
    在流缓冲区的顶部等待,准备上下一条总线。流将加载
    3
    ,等待20毫秒,然后在重复此循环之前退出

    不过,我认为第一种情况更可能发生,因为我希望服务器要么开始追赶,要么进一步落后,因为这两台服务器要么开始同步,要么随着服务器越来越落后,内部TPC流缓冲区填满

    这里的要点是,您需要某种方法来同步客户端和服务器连接。我建议在消息开始和结束时向single发送“开始字节”和“结束字节”,这样您就不会过早退出该函数。
    或者发送一个起始字节,后跟以字节为单位的数据包大小,然后填充缓冲区,直到缓冲区具有正确的字节数。此外,还可以包含一个结束字节,用于一些基本的错误检查

    这是一个非常复杂的话题,如果没有任何代码,很难真正给你一个好的答案,但这也应该对将来可能有类似问题的人有所帮助

    编辑我回去重新阅读了你的问题,注意到你说问题只涉及大量数据,所以我认为我最初的假设是错误的,更可能是情况2,因为客户端向服务器发送数据的速度比服务器读取数据的速度快,因此,这可能会成为连接的瓶颈,客户端只能在服务器清空部分TCP流缓冲区后发送额外的数据