我应该在非80端口上使用WebSocket吗?它是否会毁掉使用现有Web/HTTP基础架构的整个目的?我认为它不再符合非80端口上的Web Socket 名称.
如果我在其他端口上使用WebSocket,为什么不直接使用TCP呢?或者WebSocket协议本身有什么特别的好处吗?
由于当前的WebSocket握手是HTTP UPGRADE请求的形式,这是否意味着我必须在端口上启用HTTP协议,以便可以完成WebSocket握手?
是否有任何开源替代Pusher.com?我喜欢易用性和闪回的后备,但我被月度会员费用拖延了.我不介意托管我自己的开源替代品.任何帮助将不胜感激.
根据这里:
HTTP Upgrade标头请求服务器将应用层协议从HTTP切换到WebSocket协议.
客户端握手在IE10和服务器之间建立了HTTP-on-TCP连接.在服务器返回其101响应之后,应用层协议从HTTP切换到使用先前建立的TCP连接的WebSockets.
此时HTTP完全脱离了图片.使用轻量级WebSocket线协议,任何端点现在都可以随时发送或接收消息.
所以,我的理解是,在第一个客户端完成与服务器的握手后,服务器的80端口将被WebSocket协议垄断.并且HTTP不再在80端口上运行.
那么第二个客户端如何与服务器交换握手.所有WebSocket握手都是HTTP格式.
谢谢你到目前为止的所有答案.他们真的很有帮助.
现在我明白同一台服务器的80端口是由多个连接共享的TCP.这种共享完全没问题,因为TCP连接是由5元素元组标识Jan-Philip Gehrcke出来的.
我想补充几点想法.
这两个WebSocket和HTTP仅仅是应用层协议.通常他们都依赖TCP协议作为他们的运输.
WebSocket设计有意为握手和后续通信选择服务器的端口80 .我认为设计人员希望从传输级别的角度看 WebSocket通信看起来像普通的HTTP通信(即服务器端口号仍然是80).但根据jfriend00答案,这个技巧并不总是欺骗网络基础设施.
来自RFC 6455 - WebSocket协议
基本上,考虑到Web的限制,它应尽可能地将原始TCP暴露给脚本.它的设计也使其服务器可以与HTTP服务器共享一个端口,使其握手成为有效的HTTP升级请求.可以在概念上使用其他协议来建立客户端 - 服务器消息传递,但WebSockets的目的是提供一个相对简单的协议,该协议可以与HTTP和部署的HTTP基础结构(例如代理)共存,并且尽可能安全地接近TCP.在给定安全性考虑的情况下使用此类基础结构,通过有针对性的添加来简化使用并简化简单事务(例如添加消息语义).
所以我认为我在下面的陈述中错了:
握手请求模仿 HTTP请求,但后面的通信没有.握手请求到达端口80上的服务器. 由于它是80端口,服务器将使用HTTP协议对其进行处理.这就是为什么WebSocket握手请求必须是HTTP格式的原因. 如果是这样,我认为必须修改/扩展HTTP协议以识别那些特定于WebSocket的东西.否则它将无法实现它应该屈服于 WebSocket协议.
我认为应该这样理解:
WebSocket通信以从客户端到服务器的有效 …
我已经看到了用于asp.net MVC聊天应用程序的signalR vs html5 websockets,但它没有100%回答我的问题,因为它基于HTML5 WebSockets,微软可能已经在.NET 4.5中使用他们的WebSocket对象进行了扩展.
我想知道WebSocket功能是否确实与SignalR相同,并且在WebSockets不可用时又回退到长轮询?当然,微软在采用这种技术的方法中会采用与SignalR相同的技术吗?
编辑:
对于其他任何想知道这个的人,我发现这个评论最有助于理解这个场景以及为什么我会使用SignalR:
嗯,他们不是真的.到目前为止,IIS和ASP.NET没有内置任何受支持的WebSockets,因此SignalR项目必须自己构建它.现在微软正在提供管道,SignalR可以轻松切换到使用微软的实现,无论是自己的还是替代.SignalR是一个实现细节的抽象,WebScockets类是实现细节
我试图使用node.js的套接字,我成功但我不知道如何区分我的代码中的客户端.关于套接字的部分是这样的:
var WebSocketServer = require('ws').Server,
wss = new WebSocketServer({port: 8080});
wss.on('connection', function(ws) {
ws.on('message', function(message) {
console.log('received: %s', message);
ws.send(message);
});
ws.send('something');
});
Run Code Online (Sandbox Code Playgroud)
这段代码适用于我的客户端js.
但我想向特定用户或在我的服务器上打开套接字的所有用户发送消息.
在我的情况下,我作为客户端发送消息,我收到响应,但其他用户没有显示任何内容.
我想例如user1通过webSocket向服务器发送消息,并向打开套接字的用户2发送通知.
假设我有一个以端口启动的节点服务器nn,并且没有任何WebSocket服务.
问题是我的客户端尝试将WebSocket服务连接到此服务器.
显然,它应该无法连接到服务器.
但我无法捕捉到这个错误,我的客户端代码如下:
try {
this.ws = new WebSocket('ws://xxx:nn');
} catch ( e ) {
fallback();
console.warn(e);
}
Run Code Online (Sandbox Code Playgroud)
我的期望是fallback在连接失败时调用方法,但实际上我可以通过上面捕获它的错误try...catch
有谁知道如何在我的用例中捕获错误?
我正在进行实时的实时Web应用程序开发.
浏览器用户应该能够通过node.js服务器相互通信.其中一个用户写入消息,所有其他用户将获得它.
我不太了解RabbitMQ的工作原理.但是从快速阅读来看,它似乎处理消息的发布/订阅.
用户(在浏览器中)发布内容,订阅者(在其他浏览器中)获取该消息.这不是Socket.io用websockets做的吗?
这是我的问题:
自从我在Mac OS El Capitan上从Chrome 58 => 59升级后,当我使用Dev Tools网络检查器查看WebSocket框架时,框架不再可见.我们构建了一个大量使用WS的应用程序,所以我非常依赖这个功能.
我想也许这可能是我们在应用程序中改变的 - 编码或协议可能导致它不显示,所以我在这里尝试了这个简单的测试:https://websocket.org/echo.html
这导致DevTools中没有显示任何框架,但套接字消息与应用程序一起正常工作.我问过其他几个人,其中一些人没有这个问题.
我想知道我是否有一个导致此问题的扩展,或者我是否有其他可能阻止帧显示的神秘设置?
2014-02-07编辑:Eclipse的月神是在这里,和Tomcat的8支持包含在捆绑的WTP:)快乐的日子!
Tomcat 8仍在开发中,但你可以在这里得到它.现在主Apache Tomcat页面上有一个RC版本.更新2/27/14:8现已发布,并为WTP构建适配器,尚未集成到eclipse捆绑包中.不久!
但是在Eclipse Kepler中,Tomcat 8的添加服务器列表中没有受支持的适配器.Tomcat 7适配器不起作用,并且它看起来不像在"安装新扩展"中要下载它的新扩展名对话.
我唯一的选择是让它(Tomcat 8)在Eclipse之外的本地运行,并且可能将远程调试器挂钩到它中以便逐步执行代码?这甚至适用于Eclipse Kepler + Tomcat 8吗?IntelliJ IDEA 12无法在我进入该路径的30分钟内完成.
如果你想知道我为什么要这样做,我正在玩Spring 4.0.0.M1和4.0.0.M2 WebSocket的东西.他们(根据Rossen Stoyanchev的Spring 4.0 博文和示例)使用JSR-356,它在Tomcat 8中实现,理论上可以在某些时候反向移植到Tomcat 7.
回答更广泛的问题"如何轻松获得Spring 4 WebSocket支持的开发环境?" 会很好,但知道如何将不支持的Web服务器插入Eclipse仍然会很好.
干杯,E
**更新8/7/13 - Rossen Stoyanchev更新了Spring 4.0.0.M2博客并添加了一些jpda智慧并分享了,是的,他正在使用远程调试:
也就是说,在Eclipse中调试Tomcat 8并不是很难.只需将bin/startup.sh中的最后一行更改为(注意添加"jpda"):
Run Code Online (Sandbox Code Playgroud)exec "$PRGDIR"/"$EXECUTABLE" jpda start "$@"Eclipse内部为localhost端口80创建远程调试配置,在启动Tomcat后启动它,并且可以在源代码中放置断点.
谢谢Rossen!
**更新9/29/13 - Eclipse Kepler SR1刚到,但唉!Tomcat 8没有WTP支持.Tomcat 8最多可达RC3.
**更新12/5/13
与直接MQTT相比,MQTT优于WebSocket的优点是什么?
我正在考虑在我的项目中使用MQTT,所以我想知道为什么有些人选择MQTT over WebSocket而不是直接MQTT.