WebSockets应⽤场景介绍及Springboot整合Websocket案例web后端是指什么
(后端向前。。。
⼀、什么是websocket
WebSocket协议是基于TCP的⼀种新的⽹络协议。它实现了客户端与服务器全双⼯通信,学过计算机⽹络都知道,既然是全双⼯,就说明了服务器可以主动发送信息给客户端。这与我们的推送技术或者是多⼈的功能不谋⽽合。
为什么不使⽤HTTP 协议呢?这是因为HTTP是单⼯通信,通信只能由客户端发起,客户端请求⼀下,服务器处理⼀下,这就太⿇烦了。于是websocket应运⽽⽣。
⼆ WebSockets 的应⽤场景
没有其他技术能够像WebSocket⼀样提供真正的双向通信,许多web开发者仍然是依赖于ajax的长轮询来实现。(注:我认为长轮询是富于创造性和多功能性的,虽然这只是⼀个不太完美的解决办法(hack))对Websocket缺少热情,也许是因为多年前他的安全性的脆弱,抑或者是缺少浏览器的⽀持,不管怎样,这两个问题都已经被解决了。
决定⼿头的⼯作是否需要使⽤WebSocket技术的⽅法很简单:
你的应⽤提供多个⽤户相互交流吗?
你的应⽤是展⽰服务器端经常变动的数据吗?
如果你的回答是肯定的,那么请考虑使⽤WebSocket。如果你仍然不确定,并想要更多的灵感,这有⼀些杀⼿锏的案例。
1.社交订阅
对社交类的应⽤的⼀个裨益之处就是能够即时的知道你的朋友正在做什么。虽然听起来有点可怕,但是我们都喜欢这样做。你不会想要在数分钟之后才能知道⼀个家庭成员在馅饼制作⼤赛获胜或者⼀个朋友订婚的消息。你是在线的,所以你的订阅的更新应该是实时的。
2.多玩家游戏
⽹络正在迅速转变为游戏平台。在不使⽤插件(我指的是Flash)的情况下,⽹络开发者现在可以在浏览器中实现和体验⾼性能的游戏。⽆论你是在处理DOM元素、CSS动画,HTML5的canvas或者尝试使⽤WebGL,玩家之间的互动效率是⾄关重要的。我不想在我扣动扳机之后,我的对⼿却已经移动位置。
3.协同编辑/编程
我们⽣活在分布式开发团队的时代。平时使⽤⼀个⽂档的副本就满⾜⼯作需求了,但是你最终需要有⼀个⽅式来合并所有的编辑副本。版本控制系统,⽐如Git能够帮助处理某些⽂件,但是当Git发现⼀个它不能解决的冲突时,你仍然需要去跟踪⼈们的修改历史。通过⼀个协同解决⽅案,⽐如WebSocket,我们能够⼯作在同⼀个⽂档,从⽽省去所有的合并版本。这样会很容易看出谁在编辑什么或者你在和谁同时在修改⽂档的同⼀部分。
4.点击流数据
分析⽤户与你⽹站的互动是提升你的⽹站的关键。HTTP的开销让我们只能优先考虑和收集最重要的数据部分。然后,经过六个⽉的线下分析,我们意识到我们应该收集⼀个不同的判断标准——⼀个看起来不是那么重要但是现在却影响了⼀个关键的决定。与HTTP请求的开销⽅式相⽐,使⽤Websocket,你可以由客户端发送不受限制的数据。想要在除页⾯加载之外跟踪⿏标的移动?只需要通过WebSocket连接发送这些数据到服务器,并存储在你喜欢的NoSQL数据库中就可以了(MongoDB是适合记录这样的事件的)。现在你可以通过回放⽤户在页⾯的动作来清楚的知道发⽣了什么。
5.股票基⾦报价
⾦融界瞬息万变——⼏乎是每毫秒都在变化。我们⼈类的⼤脑不能持续以那样的速度处理那么多的数据,所以我们写了⼀些算法来帮我们处理这些事情。虽然你不⼀定是在处理⾼频的交易,但是,过时
的信息也只能导致损失。当你有⼀个显⽰盘来跟踪你感兴趣的公司时,你肯定想要随时知道他们的价值,⽽不是10秒前的数据。使⽤WebSocket可以流式更新这些数据变化⽽不需要等待。
6.体育实况更新
现在我们开始讨论⼀个让⼈们激情澎湃的愚蠢的东西——体育。我不是运动爱好者,但是我知道运动迷们想要什么。当爱国者在打⽐赛的时候,我的妹夫将会沉浸于这场⽐赛中⽽不能⾃拔。那是⼀种疯狂痴迷的状态,完全发⾃内⼼的。我虽然不理解这个,但是我敬佩他们与运动之间的这种强烈的联系,所以,最后我能做的就是给他的体验中降低延迟。如果你在你的⽹站应⽤中包含了体育新闻,WebSocket能够助⼒你的⽤户获得实时的更新。
7.多媒体聊天
视频会议并不能代替和真⼈相见,但当你不能在同⼀个屋⼦⾥见到你谈话的对象时,视频会议是个不错的选择。尽管视频会议私有化做
的“不错”,但其使⽤还是很繁琐。我可是开放式⽹络的粉丝,所以⽤WebSockets getUserMedia API和HTML5⾳视频元素明显是个不错的选择。WebRTC的出现顺理成章的成为我刚才概括的组合体,它看起来很有希望,但其缺乏⽬前浏览器的⽀持,所以就取消了它成为候选⼈的资格。
8.基于位置的应⽤
越来越多的开发者借⽤移动设备的GPS功能来实现他们。如果你⼀直记录⽤户的位置(⽐如运⾏应⽤来记录运动轨迹),你可以收集到更加细致化的数据。如果你想实时的更新⽹络数据仪表盘(可以说是⼀个监视运动员的教练),HTTP协议显得有些笨拙。借⽤WebSocket TCP链接可以让数据飞起来。
9.在线教育
上学花费越来越贵了,但互联⽹变得更快和更便宜。是学习的不错⽅式,尤其是你可以和⽼师以及其他同学⼀起交流。很⾃
然,WebSockets是个不错的选择,可以多媒体聊天、⽂字聊天以及其它优势如与别⼈合作⼀起在公共数字⿊板上画画...
三 整合websocket
2、添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
3、在application.properties⽂件修改端⼝号
⼀句话:server.port=8081
4、新建config包,创建WebSocketConfig类
import t.annotation.Bean;
import t.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketStompConfig {
//这个bean的注册,⽤于扫描带有@ServerEndpoint的注解成为websocket ,如果你使⽤外置的tomcat就不需要该配置⽂件 @Bean
public ServerEndpointExporter serverEndpointExporter()
{
return new ServerEndpointExporter();
}
}
5、新建service包,创建WebSocket类
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import urrent.ConcurrentHashMap;
import urrent.CopyOnWriteArraySet;
import urrent.atomic.AtomicInteger;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
llect.Maps;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* @Author:JCccc
* @Description:
* @Date: created in 15:56 2019/5/13
*/
@Component
@ServerEndpoint(value = "/connectWebSocket/{userId}")
public class WebSocket {
private Logger logger = Class());
/**
* 在线⼈数
*/
public static int onlineNumber = 0;
/**
/**
* 以⽤户的姓名为key,WebSocket为对象保存起来
*/
private static Map<String, WebSocket> clients = new ConcurrentHashMap<String, WebSocket>(); /**
* 会话
*/
private Session session;
/**
* ⽤户名称
*/
private String userId;
/**
* 建⽴连接
*
* @param session
*/
@OnOpen
public void onOpen(@PathParam("userId") String userId, Session session)
{
onlineNumber++;
logger.info("现在来连接的客户id:"+Id()+"⽤户名:"+userId);
this.userId = userId;
this.session = session;
// logger.info("有新连接加⼊! 当前在线⼈数" + onlineNumber);
try {
/
/messageType 1代表上线 2代表下线 3代表在线名单 4代表普通消息
//先给所有⼈发送通知,说我上线了
Map<String,Object> map1 = wHashMap();
map1.put("messageType",1);
map1.put("userId",userId);
JSONString(map1),userId);
//把⾃⼰的信息加⼊到map当中去
clients.put(userId, this);
logger.info("有连接关闭! 当前在线⼈数" + clients.size());
//给⾃⼰发⼀条消息:告诉⾃⼰现在都有谁在线
Map<String,Object> map2 = wHashMap();
map2.put("messageType",3);
//移除掉⾃⼰
Set<String> set = clients.keySet();
map2.put("onlineUsers",set);
JSONString(map2),userId);
}
catch (IOException e){
logger.info(userId+"上线的时候通知所有⼈发⽣了错误");
}
}
@OnError
public void onError(Session session, Throwable error) {
logger.info("服务端发⽣了错误"+Message());
//error.printStackTrace();
//error.printStackTrace();
}
/**
* 连接关闭
*/
@OnClose
public void onClose()
{
onlineNumber--;
//ve(this);
try {
//messageType 1代表上线 2代表下线 3代表在线名单 4代表普通消息
Map<String,Object> map1 = wHashMap();
map1.put("messageType",2);
map1.put("onlineUsers",clients.keySet());
map1.put("userId",userId);
JSONString(map1),userId);
}
catch (IOException e){
logger.info(userId+"下线的时候通知所有⼈发⽣了错误");
}
//logger.info("有连接关闭! 当前在线⼈数" + onlineNumber);
logger.info("有连接关闭! 当前在线⼈数" + clients.size());
}
/**
* 收到客户端的消息
*
* @param message 消息
* @param session 会话
*/
@OnMessage
public void onMessage(String message, Session session)
{
try {
logger.info("来⾃客户端消息:" + message+"客户端的id是:"+Id()); System.out.println("------------ :"+message);
JSONObject jsonObject = JSON.parseObject(message);
String textMessage = String("message");
String fromuserId = String("userId");
String touserId = String("to");
//如果不是发给所有,那么就发给某⼀个⼈
//messageType 1代表上线 2代表下线 3代表在线名单 4代表普通消息
Map<String,Object> map1 = wHashMap();
map1.put("messageType",4);
map1.put("textMessage",textMessage);
map1.put("fromuserId",fromuserId);
if(touserId.equals("All")){
map1.put("touserId","所有⼈");
JSONString(map1),fromuserId);
}
else{
map1.put("touserId",touserId);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论