抢注域名网站,怎么弄一个电商平台,长沙app开发公司排名,wordpress 图像主题一篇文章理解WebSocket原理 1.HTTP协议(半双工通信)#xff1a;
HTTP是客户端向服务器发起请求#xff0c;服务器返回响应给客户端的一种模式。
特点#xff1a;
1.只能是客户端向服务器发起请求#xff0c;是单向的。
2.服务器不能主动发送数据给客户端。
半双工通信… 一篇文章理解WebSocket原理 1.HTTP协议(半双工通信)
HTTP是客户端向服务器发起请求服务器返回响应给客户端的一种模式。
特点
1.只能是客户端向服务器发起请求是单向的。
2.服务器不能主动发送数据给客户端。
半双工通信的局限性也从中体现出来同一时刻数据的传输只能是单向的想在某一段时间内监听服务器是否有新数据的更新就要不停的从客户端这边发起请求如果服务器有数据更新那么就会返回响应。那么这种做法是特别消耗性能的想到一种更优的办法就是监听服务器如果有数据改变就立刻返回响应不需要客户端一直不停的请求。
举个例子HTTP协议就是小明要去超市买薯片老板说没有过了一会小明又跑来超市买薯片老板还是说没有这样反反复复过了很多次超市进货的薯片终于到了小明也拿到薯片了。这样感觉是不是特别麻烦呢如果使用WebSocket协议就是小明把他的电话和地址给了超市老板当超市进货的薯片到了后老板第一时间给小明打电话告诉他薯片到了小明可以自己来拿也可以超市老板送货上门。这样是不是就更省时更省事呢
2.WebSocket协议(全双工通信)
WbeSocket 是 Html5 开始提供的一种浏览器与服务器之间进行全双工通信的协议websocket协议本质上是一个基于tcp的协议它实现了浏览器与服务器全双工通信能更好的节省服务器资源和带宽并达到实时通讯的目的属于应用层基于TCP协议并且复用HTTP握手通道是一个持久化的协议
简单来说建立一个Websocket连接客户端浏览器首先要向服务器发起一个HTTP请求这个请求头中包含了特殊的Upgrade: WebSocket信息表明这是一个从HTTP升级到WebSocket的请求服务器解析之后返回响应给客户端并建立了WebSocket连接。
3.WebSocket 与 HTTP 的关系 相同点
都是基于TCP协议的都是可靠性传输协议。
都是应用层协议
不同点
WebSocket是全双工通信协议模拟Socket协议可以双向发送或接收信息。
HTTP是单向通信的。
WebSocket是需要浏览器和服务器握手建立连接的。
HTTP是浏览器发请求向服务器的连接而服务器则不会提前知道这个连接。
3.http和WebSocket的联系
WebSocket在建立握手是数据是通过HTTP传输的但是建立了连接后传输则不需要HTTP协议。
总体过程
客户端发起HTTP请求请过三次握手后与服务器建立TCP连接HTTP请求中包含了WebSocket的版本号信息Upgrade、Connection、WebSocket-Version等。
服务器接收到客户端的握手请求后使用HTTP协议返回响应给客户端。
最后客户端收到连接成功消息后可以借助TCP传输协议和服务器进行全双工通信。
4.WebSocket特点 WebSocket约定了一个通信的规范通过一个握手机制将客户端与服务器端进行一个类似TCP的连接实现了通信。 在使用WebSocket之前客户端与服务器端的交互是基于HTTP协议的短连接或长连接。 WebSocket的协议名是ws是一种全新的协议不属于HTTP无状态协议。
WebSocket和socket的区分从本质上来说socket并不是一个新的协议它只是为了便于程序员进行网络编程而对tcp/ip协议族通信机制的一种封装。
5.实现WebSocket用例
事件说明open连接建立时触发message客户端接收到服务器消息时触发error通信出现错误时触发close连接关闭时触发send客户端给服务器发送数据
5.1 java api实现
import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;public class SocketServer extends WebSocketServer {public static void main(String[] args) throws InterruptedException, IOException {int port 8887; // 843 flash policy portSocketServer s new SocketServer(port);s.start();System.out.println(ChatServer started on port: s.getPort());BufferedReader sysIn new BufferedReader(new InputStreamReader(System.in));while (true) {String in sysIn.readLine();s.broadcast(in);if (in.equals(exit)) {s.stop(1000);break;}}}public SocketServer(int port) {super(new InetSocketAddress(port));}Overridepublic void onOpen(WebSocket conn, ClientHandshake handshake) {conn.send(Welcome to the server!); // This method sends a message to the new clientbroadcast(new connection: handshake.getResourceDescriptor()); // This method sends a message to all clients connectedSystem.out.println(conn.getRemoteSocketAddress().getAddress().getHostAddress() entered the room!);}Overridepublic void onClose(WebSocket conn, int code, String reason, boolean remote) {broadcast(conn has left the room!);System.out.println(conn has left the room!);}Overridepublic void onMessage(WebSocket conn, String message) {broadcast(message);System.out.println(conn : message);}Overridepublic void onError(WebSocket conn, Exception ex) {ex.printStackTrace();if (conn ! null) {// some errors like port binding failed may not be assignable to a specific// websocket}}Overridepublic void onStart() {System.out.println(Server started!);setConnectionLostTimeout(0);setConnectionLostTimeout(100);}}
启动服务 http://www.websocket-test.com/ 进入此网站连接本地websokcet服务ws://127.0.0.1:8887 可以互相发送消息
5.2 springboot结合redis实现发给其他人 修改端口启动3个实例,8080,8081,8082 http://www.websocket-test.com/ 依旧进入此网站连接本地启动的websocket服务 其中1和11两个客户端连同一台服务
ws://127.0.0.1:8080/websocket?userId1
ws://127.0.0.1:8080/websocket?userId11
ws://127.0.0.1:8081/websocket?userId2
ws://127.0.0.1:8082/websocket?userId3在1客户端发送消息给3
1和3连接的服务端不在同一个通过redis发布3所在服务端的redis监听消息输出信息然后发给3客户端
1服务端 3服务端输出redis监听的消息 3服务端收到发给3客户端