本篇文章给大家带来的内容是关于java如何制作一个websocket网页聊天室(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
一、什么是webSocket
WebSocket 是一种网络通信协议,是持久化协议。RFC6455 定义了它的通信标准。
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
二、为什么要使用webSocket
传统的web通信是使用的http技术,http协议是无状态的、无连接的、单向的应用层协议。一次请求只能对应一个响应,通信请求只能由客户端发出,服务端对请求做出响应。所以服务端发出响应是非常被动的,这种被动的响应注定了服务端无法及时的给客户端主动推送响应,如果服务端有连续的状态变化的时候,客户端获取是很困难的。通过频繁使用了异步ajax去不断地获取请求去实现长轮询,这样做是特别消耗性能,而且效率低下。(不停的握手,或者长时间保持live)。
而webSocket允许服务器和客户端之间建立全双工通信,只要建立一次连接,就能一直保持连接状态。一旦建立一次连接,就能双方互相通信,不需要多次握手。
三、实现WEB聊天室
-
添加pom.xml,引入jar包
立即学习“Java免费学习笔记(深入)”;
javax javaee-api 7.0 provided
2.建立html和js文件
在线聊天室 聊天室
开始聊天
3.后台java代码
package controller;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
import javax.net.ssl.SSLSession;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/websocket")
public class WebScoketServer {
private static Integer onlineNum = 0; //当前在线人数,线程必须设计成安全的
private static CopyOnWriteArraySet arraySet = new CopyOnWriteArraySet(); //存放每一个客户的的WebScoketServer对象,线程安全
private Session session;
/**
* 连接成功
* @param session 会话信息
*/
@OnOpen
public void onOpen(Session session) {
this.session =session;
arraySet.add(this);
this.addOnlineNum();
System.out.println("有一个新连接加入,当前在线 "+this.getOnLineNum()+" 人");
}
/**
* 连接关闭
*/
@OnClose
public void onClose() {
arraySet.remove(this);
this.subOnlineNum();
System.out.println("有一个连接断开,当前在线 "+this.getOnLineNum()+" 人");
}
/**
* 连接错误
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
System.err.println("发生错误!");
error.printStackTrace();
}
/**
* 发送消息,不加注解,自己选择实现
* @param msg
* @throws IOException
*/
public void onSend(String msg) throws IOException {
this.session.getBasicRemote().sendText(msg);
}
/**
* 收到客户端消息回调方法
* @param session
* @param msg
*/
@OnMessage
public void onMessage(Session session, String msg) {
System.out.println("消息监控:"+msg);
for (WebScoketServer webScoketServer : arraySet) {
try {
webScoketServer.onSend(msg);
} catch (IOException e) {
e.printStackTrace();
continue;
}
}
}
/**
* 增加一个在线人数
*/
private synchronized void addOnlineNum() {
onlineNum++;
}
/**
* 减少一个在线人数
*/
private synchronized void subOnlineNum() {
onlineNum--;
}
private Integer getOnLineNum() {
return onlineNum;
}
}











