WebSocket简介
WebSocket是一种在单个TCP连接上进行全双工通信的协议。使用WebScoket能够替代原始的轮询方式。
使用WebSocket实现简易聊天室
服务端:
pom.xml
<dependencies>
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
服务类:
使用@ServerEndpoint注解将一个类声明为webSocket服务器
使用@onOpen注解将一个方法声明为建立连接的回调方法
使用@onClose注解将一个方法声明为断开连接的回调方法
使用@onMessage注解将一个方法声明为收到消息的回调方法
使用@onError注解将一个方法声明为出现异常的回调方法
使用session.getBasicRemote().sendText()方法向指定连接发送字符消息
package com.llg;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
@ServerEndpoint(value = "/MyServer")
public class WebSocketServer {
//统计连接人数
private static volatile int total = 0;
//记录每个连接的session,以便发送消息
private static Set<Session> sessions = new HashSet<>();
//建立连接回调方法
@OnOpen
public void onOpen(Session session){
total++;
sessions.add(session);
sendMessage("有人加入了聊天室,当前人数"+ total);
}
//连接断开回调
@OnClose
public void onClose(Session session){
//移除已断开的连接
total --;
sessions.remove(session);
sendMessage("有人离开了聊天室,当前人数"+ total);
}
//收到消息时回调
@OnMessage
public void onMessage(Session session,String message){
//将消息广播给所有人
sendMessage(message);
}
public void sendMessage(String message){
//循环给每个连接的客户端发送消息
for (Session session : sessions) {
try {
session.getBasicRemote().sendText(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>聊天室</title>
<style>
#content{
overflow: auto;
}
</style>
</head>
<body>
<textarea id="content" rows="20" cols="40"></textarea><br>
<input type="text"/><br>
<button>发送</button>
<script>
var content = document.getElementById("content")
var sendInput = document.getElementsByTagName("input")[0]
var btn = document.getElementsByTagName("button")[0];
var ws = null;
if ('WebSocket' in window){
ws = new WebSocket("ws:localhost:8080/WebSocket1/MyServer")
}else {
alert("浏览器不支持");
}
//建立连接回调
ws.onopen = function(){
content.text = "\n成功连接到服务器";
}
//连接断开回调
ws.onclose = function () {
content.text = "\n连接已断开";
}
//收到消息回调
ws.onmessage = function (event) {
console.log(event);
content.innerHTML += "\n"+event.data;
}
//出错回调
ws.onerror = function () {
console.log("出错了")
}
//点击按钮发送消息
btn.onclick = function () {
var message = sendInput.value;
if(message != ""){
ws.send(message);
}
}
//窗口关闭,断开连接
window.onclose = function () {
ws.close();
}
</script>
</body>
</html>