根据维基百科,HTTP和WebSocket之间的唯一关系是以a形式的额外握手Upgrade HTTP request.之后,似乎浏览器和HTTP服务器将通过普通套接字在旧的C/S范例中进行通信.
所以我的问题是:
WebSocket,因为通信目标服务器的80端口?即port 80只是同义词web.今天,我重温了@ jfriend00的优秀答案.让我们总结一下我的理解.
我认为:
to share a port,它实际上意味着to have the requests processed by the same program listening on that port.WebSocket握手resemblesHTTP格式,因此can处理HTTP协议的服务器程序可以理解.所以发送握手请求是可以的port 80.
但是after the handshake,WebSocket数据格式与HTTP格式完全不同,它怎么还能发送到端口80?如下面的URL:
ws://somehost:80/chat
它是如何运作的?
我猜:
HTTP程序是否在端口80上看到传入的请求cannot be handled as HTTP,然后它将它传递给WebSocket程序来处理它.如果是这样,如果有一些其他协议想要共享端口80,比如WebSocket2,如果没有办法识别正在使用的协议,那么HTTP程序如何知道要传递哪个协议.
根据jfriend00回复,我绘制了下图:
因此,同一浏览器中的WebSocket和HTTP流量实际上是通过different套接字连接实现的.虽然他们都开始连接到服务器的端口80.
我认为如果WebSocket这个词中没有包含套接字,那么将它更容易理解为TCP协议上的另一个应用程序级协议.
我根据jfriend00进一步的评论将上面的图表改进了下面.我想要展示的是WebSocket如何与coexist浏览器中的同一服务器进行通信和HTTP通信.
读完这个帖子之后,我回想一下,当服务器接受连接时,服务器端口不会改变:当服务器接受TCP连接时,端口是否会改变?
所以图表应该是这样的:
HTTP的TCP连接和WebSocket的TCP连接应该使用不同的client ports.
我想知道socket.io方法如何用于发出某个事件,我已经读过它不像长轮询方法,而是一个可以在所有不同浏览器上工作的不同方法...客户端如何保持 - 没有长轮询请求与服务器联系?
我是node.js的新手,我想为eventdriven服务器实现我自己的系统(是的......重新发明轮子!)因为我想用手触摸这个如此简单的"socket.io - emit ()" 方法.
谢谢你的帮助!
为了建立WebSocket连接,客户端发送WebSocket握手请求,服务器为此返回WebSocket握手响应,如下例所示.[30]
客户端请求(就像在HTTP中一样,每行以\ r \n结尾,并且末尾必须有一个额外的空行):
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
Run Code Online (Sandbox Code Playgroud)
服务器响应:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
Run Code Online (Sandbox Code Playgroud)
我无法理解.要初始化连接,将发送HTTP GET请求.但是,如果我不托管HTTP服务器但我只托管WebSocket服务器怎么办?那么它如何处理HTTP请求呢?