javaweb聊天室(spring websocket)
程序员文章站
2022-05-17 09:31:27
...
用javaweb写聊天室,可能大多人会困惑于怎么用广播让其他人看到消息,然而http协议是短链接进行访问模式,无法像tcp协议一样建立长链接,当然大多人想到用ajax定时访问服务器获得信息的方式,可这种方式在链接过多的时候效率比较低。
WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工
(full-duplex)通信——允许服务器主动发送信息给客户端。
前端:
html页面必须引入:
<script src="http://cdn.sockjs.org/sockjs-0.3.min.js"></script>
然后在js代码中:
<script type="text/javascript">
var websocket;
websocket = new WebSocket("ws://127.0.0.1:8080/echo"); //需要项目名的加在8080/后面
websocket.onopen = function (evnt) {//链接成功后的返回方法
websocket.send("hello");//发送消息的方法
};
websocket.onmessage = function (evnt) {//接受消息的返回方法
var message=evnt.data;
alert(message);//输出接受到的消息
};
websocket.onerror = function (evnt) {//出错的返回方法
};
websocket.onclose = function (evnt) {//关闭链接的返回方法
};
</script>
注意:链接404可能是你tomcat问题或者javaee版本问题,最好使用maven管理,并且使用maven的tomcat插件后端用javaweb实现,采用spring+springmvc+websocket,先导入依赖,
<!-- websocket聊天室核心实现全双工 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-messaging</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
spring配置文件:
<!-- 自动注入chatrum中的bean -->
<context:component-scan base-package="chatrum" />
springMVC配置文件:
<!-- 处理静态资源被“/”所拦截的问题 -->
<mvc:default-servlet-handler />
下面是核心代码,注册websocket,就是把每一个链接注入同一个处理对象
@Configuration
@EnableWebSocket // 开启websocket
public class WebSocketConfig implements WebSocketConfigurer {
@Autowired
private WebSocketHander webSocketHander;
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(webSocketHander, "/echo");
}
}
下面是实现websockethadler:
@Service
public class WebSocketHander implements WebSocketHandler {
private static final ArrayList<WebSocketSession> users =
new ArrayList<WebSocketSession>();
public void afterConnectionEstablished(WebSocketSession session)
throws Exception {
//链接成功进入方法
users.add(session);//把新链接的用户加入list
}
public void handleMessage(WebSocketSession session,
WebSocketMessage<?> webSocketMessage) throws Exception {
//接受消息方法
for(WebSocketSession user : users) {
if (user.isOpen()) {
user.sendMessage(new TextMessage(
webSocketMessage.getPayload() + "")
//发送消息为TextMessage对象格式
);//给在线用户发送消息
}
}
}
public void handleTransportError(WebSocketSession session,
Throwable exception) {
//出错
}
public void afterConnectionClosed(WebSocketSession session,
CloseStatus closeStatus) {
//关闭
}
public boolean supportsPartialMessages() {
return false;
}
}
这样就完成了!其他的就是自定义的功能了
我的项目:
用javaweb技术实现网络聊天室,即提供多人通过文字与命令进行实时交谈、聊天的网页,并且实时显示在线用户。
演示:http://120.78.164.110:8080/Chatrum/rum/chat.html
源码:https://github.com/Vimmone/Chatrum