HTTP 协议是一种非持久性、单向网络协议。连接建立后,只允许浏览器向服务器发出请求,服务器才能返回相应的数据。当需要即时通讯时,浏览器以特定的时间间隔(比如1秒)通过轮询的方式向服务器发送Request请求,然后将最新的数据返回给浏览器。这种方法最明显的缺点是需要不断地发送请求,而且通常HTTP请求的头部很长。为了传输少量的数据,需要付出巨大的代价,这是非常不经济的,并且占用大量的带宽。
在WebSocket中,服务器和浏览器只需要通过HTTP协议进行握手动作,然后建立独立的TCP通信通道进行数据传输。
WebSocket与HTTP的关系
相同点:
- 它们都是基于TCP的,都是可靠的传输协议。
- 它们都是应用层协议。
不同之处:
- WebSocket是一种双向通信协议,模拟Socket协议,可以双向发送或接收信息。 HTTP 是单向的。
- WebSocket 需要握手才能建立连接。
WebSocket与Socket的关系
Socket实际上并不是一种协议,而是为了方便TCP或UDP的使用而抽象出来的一层。它是应用层和传输控制层之间的一组接口。
Socket是应用层和TCP/IP协议族之间进行通信的中间软件抽象层。它是一组接口。
在设计模式上,Socket实际上是一种门面模式,将复杂的TCP/IP协议族隐藏在Socket接口的背后。对于用户来说,一组简单的接口就够了,让Socket组织数据来满足指定的需求。协议。
两台主机通信时,必须通过Socket进行连接,Socket使用TCP/IP协议来建立TCP连接。
TCP连接更多地依赖于底层IP协议,而IP协议连接依赖于较低层,例如链路层。
WebSocket是一个典型的应用层协议。
Socket是传输控制层协议,WebSocket是应用层协议。
JSR356的WebSocket规范使用javax.websocket.* API,普通Java对象(POJO)可以使用@ServerEndpoint注释作为WebSocket服务器的端点。。
@ServerEndpoint("/echo")
public class EchoEndpoint {
@OnOpen
public void onOpen(Session session) throws IOException {
//以下代码省略...
}
@OnMessage
public String onMessage(String message) {
//以下代码省略...
}
@Message(maxMessageSize=6)
public void receiveMessage(String s) {
//以下代码省略...
}
@OnError
public void onError(Throwable t) {
//以下代码省略...
}
@OnClose
public void onClose(Session session, CloseReason reason) {
//以下代码省略...
}
}
上面的简单代码创建了一个 WebSocket 服务器。
@ServerEndpoint("/echo") 的 annotation 注释端点表示将 WebSocket 服务端运行在 ws://[Server 端 IP 或域名]:[Server 端口]/websockets/echo 的访问端点
,客户端浏览器已经可以对 WebSocket 客户端 API 发起 HTTP 长连接了。
使用 ServerEndpoint 注解的类必须具有公共无参数构造函数。
用@onMessage注释的Java方法用于接收传入的WebSocket信息。该信息可以是文本格式或二进制格式。
当与此端点建立新连接时调用 OnOpen。参数提供有关连接另一端的更多详细信息。 Session表示两个WebSocket端点之间的会话连接的另一端,可以理解为类似于HTTPSession的概念。
OnClose 在连接终止时被调用。 closeReason 参数封装了更多详细信息,例如为什么关闭 WebSocket 连接。
网络中的套接字
所谓Socket API是指操作系统(也可能不是操作系统)提供的针对传输层(TCP/UDP)的抽象接口。目前的Socket API一般遵循BSD Socket规范(包括Windows)。这里调用规范是不准确的。该规范实际上是POSIX,但是BSD Unix中Socket的实现被广泛使用,因此它已经成为实际的规范。如果你想使用HTTP构建一个服务,那么你不需要关心Socket。如果你想构建一个基于TCP/IP的服务,那么Socket可能就是你会接触到的API。