webSocket
1.WebSocket简单介绍
随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端发送数据,Socket可以使用TCP/IP协议或UDP协议,
下面使用一个示例来如何使用webSocket:
1.1.需要添加的maven依赖
<!-- https://mvnrepository.com/artifact/javax.websocket/javax.websocket-api --> <!-- 核心依赖--> <dependency> <groupId>javax.websocket</groupId> <artifactId>javax.websocket-api</artifactId> <version>1.1</version> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.5</version> </dependency>
1.2.WebSocket服务器端
@ServerEndpoint("/chat/server/{userName}")
public class ChatServer {
/**
* 当客户端有连接时调用此方法
*/
@OnOpen
public void onOpen(Session session,@PathParam("userName") String userName){
System.out.println("连接人"+userName);
session.getUserProperties().put("user",userName);
}
@OnMessage
public void onMessage(String message, Session session) throws Exception{
System.out.println("接收消息..." + message);
//将消息发送给所有人
sendAllUser(message, session);
}
/**
* 当客户端关闭或者断开连接时,服务端会调用此方法
* @param session
*/
@OnClose
public void opnClose(Session session) throws IOException{
System.out.println("客户端失去连接...");
//关闭会话
session.close();
}
public void sendAllUser(String message,Session session) throws Exception {
//获取所有人的会话对象
Set<Session> users = session.getOpenSessions();
//获取发送人发给所有人
String sendUser = session.getUserProperties().get("user").toString();
//将所有数据封装成一个对象,以json 的数据格式发送给前端
ResponseVo vo = new ResponseVo();
vo.setMessage(message);
vo.setUserName(sendUser);
Date date = new Date();
String dateStr = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(date);
vo.setDate(dateStr);
Gson gson = new Gson();
String json = gson.toJson(vo);
for (Session user : users) {
user.getBasicRemote().sendText(json);
}
}
/**
* 连接错误时执行
*/
@OnError
public void onError(Throwable t) {
t.printStackTrace();
}
1.3.前端代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="loginDiv">
用户名:<input type="text" id="userName" name="userName"/>
<input type="button" id="login" value="login"/>
</div>
<div id="container" style="display: none">
<div id="content"></div>
<input type="text" name="msg" id="msg"/>
<input type="button" id="send" value="send"/>
</div>
<script src="js/jquery-3.3.1.min.js"></script>
<script>
$(function(){
var ws;
//登陆
$('#login').on('click',function(){
var userName = $('#userName').val();
//创建websocket对象并连接服务端
ws = new WebSocket('ws://localhost:8080/chat/server/' + userName);
//客户端打开连接时会回调此方法
/*ws.onopen = function(){
//...
}*/
//客户端关闭或断开连接时执行此方法
/*ws.onclose = function(){
//...
}*/
//接收服务端发送的消息
ws.onmessage = function(message){
var data = JSON.parse(message.data);
$('#content').append(data.date+","+data.userName+":"+data.message+ "<br>");
}
$('#loginDiv').css('display','none');
$('#container').css('display','block');
});
//发送消息
$('#send').on('click',function(){
var msg = $('#msg').val();
//发送消息
ws.send(msg);
});
});
</script>
</body>
</html>
1.4:运行效果


浙公网安备 33010602011771号