我正在使用HAProxy将子域上的请求发送到node.js应用程序.
我无法让WebSockets工作.到目前为止,我只能让客户端建立WebSocket连接,但之后很快就会出现断开连接.
我在ubuntu上.我一直在使用的各种版本socket.io和node-websocket-server.客户端是Safari或Chrome的最新版本.HAProxy版本是1.4.8
这是我的HAProxy.cfg
global
maxconn 4096
pidfile /var/run/haproxy.pid
daemon
defaults
mode http
maxconn 2000
option http-server-close
option http-pretend-keepalive
contimeout 5000
clitimeout 50000
srvtimeout 50000
frontend HTTP_PROXY
bind *:80
timeout client 86400000
#default server
default_backend NGINX_SERVERS
#node server
acl host_node_sockettest hdr_beg(host) -i mysubdomain.mydomain
use_backend NODE_SOCKETTEST_SERVERS if host_node_sockettest
backend NGINX_SERVERS
server THIS_NGINX_SERVER 127.0.0.1:8081
backend NODE_SOCKETTEST_SERVERS
timeout queue 5000
timeout server 86400000
server THIS_NODE_SERVER localhost:8180 maxconn 200 check
Run Code Online (Sandbox Code Playgroud)
我已经浏览了网络和邮件列表但无法获得任何建议的解决方案.
(ps这可能是针对serverfault,但是还有其他的HAProxy问题,所以我选择在这里发帖)
之前已经提出了类似的问题,他们都得出结论,AJAX不会过时.但是ajax在哪些方面比websockets更好?
使用socket.io,很容易回退到闪存或长轮询,因此浏览器兼容性似乎不是问题.
Websockets是双向的.如果ajax发出异步请求,websocket客户端会向服务器发送消息.POST/GET参数可以用JSON编码.
那么使用100%websockets有什么问题?如果每个访问者都与服务器保持持久的websocket连接,那么在整个访问会话中制作一些ajax请求会更浪费吗?
因为我在更常规的基础上使用WebSocket连接,所以我对如何在幕后工作感兴趣.所以我在一段时间内深入研究了无穷无尽的规范文档,但到目前为止,我还无法找到任何有关分块传输流本身的信息.
WebSocket协议将其称为数据帧(描述纯数据流,因此也称为非控制帧).据我了解规范,没有定义的最大长度和没有定义的MTU(最大传输单位)值,这反过来意味着单个WebSocket数据框可能包含spec(!),无限量的数据(如果我在这里错了,请纠正我,我仍然是这方面的学生).
阅读完之后,我立即设置了我的小Node WebSocket服务器.由于我有一个强大的Ajax历史(也在流媒体和Comet上),我的期望原来就像是," 在传输数据时必须有某种交互模式来读取数据 ".但那里我错了,不是吗?
我开始时很小,有4kb的数据.
服务器
testSocket.emit( 'data', new Array( 4096 ).join( 'X' ) );
Run Code Online (Sandbox Code Playgroud)
并且像预期的那样,它作为一个数据块到达客户端
客户
wsInstance.onmessage = function( data ) {
console.log( data.length ); // 4095
};
Run Code Online (Sandbox Code Playgroud)
所以我增加了有效载荷,我实际上再次期待,在某些时候,客户端onmessage处理程序将重复发射,effectivley分组传输.但令我震惊的是,它从未发生过(节点服务器,在firefox,chrome和safari客户端测试).我最大的有效载荷是80 MB
testSocket.emit( 'data', new Array( 1024*1024*80 ).join( 'X' ) );
Run Code Online (Sandbox Code Playgroud)
它仍然存在于客户端的一个大数据块中.当然,即使你有一个非常好的连接,这需要一段时间.这里的问题是
我可能仍然从WebSockets的错误角度看,可能是发送大量数据的需要不存在,你应该在发送之前自己逻辑地分块/拆分任何数据?
草案-ietf-hybi-thewebsocketprotocol-17的 1.3节"开放式握手"中描述Sec-WebSocket-Key如下:
为了证明接收到握手,服务器必须获取两条信息并将它们组合以形成响应.第一条信息来自| Sec-WebSocket-Key | 客户端握手中的头字段:
Run Code Online (Sandbox Code Playgroud)Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==对于此头字段,服务器必须获取值(如头字段中所示,例如base64编码的[RFC4648]版本减去任何前导和尾随空格),并将其与全局唯一标识符(GUID,[RFC4122]连接起来. ])字符串形式的"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",不太可能被不了解WebSocket协议的网络端点使用.然后在服务器的握手[FIPS.180-2.2002]中返回此串联的SHA-1散列(160位),base64编码(参见[RFC4648]的第4节).
这是我无法理解的事情:为什么不简单地返回代码101?如果正确使用Sec-WebSocket-Key是为了安全性,或者为了证明它们可以处理websocket请求,那么任何服务器都可以返回预期的密钥,并假装它们是WebSocket服务器.
我正在尝试创建自定义Store,它应该使用WebSocket或REST(如果WebSocket失败).
代码文件rachet-store.js
它几乎完美地工作.它也适用于REST(myRest)也没有问题.
问题是如果使用wsStore并且如果我删除datagrid中第一页或第二页上的行,则会通知datagrid并刷新自身.但是,如果我删除第三页或任何其他页面上的行,则不会刷新商店.
我认为问题可能在某处sort(),因为使用Grid(或Pagination)的工作原理.(但它只是一个猜测......)
所以,问题是,我做错了什么?
我有一个简单的场景,只要从服务器生成,就可以在移动设备上接收通知.
我知道这个工具可以在原生iOS应用程序和Android中使用,但我试图避免本机路径.我想要的是:
我知道有可能存在服务器端事件/ Web套接字,但是Web应用程序可以模拟推送通知功能吗?
谢谢
我们正在构建一个使用websockets的群聊功能.我们想测试当前基础设施可以支持的连接数.
基本上它归结为如何模拟websocket.
我拥有: 运行的C++应用程序服务器,准备将数据发送到客户端,该客户端应该是HTML5页面或应用程序.
我想要的是:如果c ++服务器和HTML5应用程序都是系统本地的,那么有没有办法使用udp端口与HTML5进行通信?
我知道的 :
答案仍然是"不"吗?
有没有可行的解决方案?
任何领导都表示赞赏.
我有兴趣构建一个小型的实时多人游戏,使用HTML5/JavaScript作为客户端,也可能使用Java作为服务器软件.
我稍微调查了一下WebSockets,但看起来我对WebSockets实际上有什么误解.我最初认为WebSockets只是JavaScript处理TCP套接字的方式,就像在Java和其他语言中使用它一样,但似乎必须进行整个握手过程,并且每次传输都包含很多HTTP开销(并且那个案例,对Ajax的好处似乎并不像第一眼那样令人兴奋)?
在一个相关的主题上,为此目的有没有更好的WebSockets替代品(JavaScript中的实时多人游戏)?
我试图了解WebRTC和WebSockets之间的区别,以便我可以更好地了解哪种情况需要什么.我很好奇两个方面的广泛想法(主要是基于网络,但可能是一个专用的服务器应用程序)彼此交谈.
假设:
问题: