转自解放号社区:http://bbs.jointforce.com/topic/25545
一.服务层
package com.demo.websocket;
import java.io.IOException;
import java.util.Iterator;
import java.util.concurrent.ConcurrentLinkedQueue;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.web.socket.handler.TextWebSocketHandler;
@Configuration
@EnableWebSocket
public class websocketListener implements WebSocketConfigurer, ServletContextListener{
private ConcurrentLinkedQueue<WebSocketSession> sessions = new ConcurrentLinkedQueue<WebSocketSession>();
private WebSocketHandlerTest handler;
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
handler = new WebSocketHandlerTest();
registry.addHandler(handler, "/ws/notifymessage.ws");
registry.addHandler(handler, "/ws/sockjs/notifymessage.ws").withSockJS();
new Thread(handler).start();
}
class WebSocketHandlerTest extends TextWebSocketHandler implements Runnable{
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
sessions.remove(session);
}
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessions.add(session);
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
super.handleTextMessage(session, message);
}
@Override
public void run() {
System.out.println("等待推送....");
try {
int i = 0;
for (;;) {
synchronized (this) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(i%10==0){
nofity("消息推送测试......");
System.out.println("推送消息了....");
}else{
System.out.println("本次不推送消息了....");
}
i++;
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("失败....");
}
}
private void nofity(String message) throws IOException {
Iterator<WebSocketSession> iterator = sessions.iterator();
while (iterator.hasNext()) {
WebSocketSession session = iterator.next();
synchronized(session){
if(session.isOpen()){
session.sendMessage(new TextMessage(message));
}else{
iterator.remove();
}
}
}
}
}
}
二.前台界面监听
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
websocket测试界面
</body>
<script type="text/javascript">
var websocketPath = "localhost:8080/demo-web";
if ('WebSocket' in window) {
websocket = new WebSocket("ws://"+websocketPath+"/ws/notifymessage.ws");
} else if ('MozWebSocket' in window) {
websocket = new MozWebSocket("ws://"+websocketPath+"/ws/notifymessage.ws");
} else {
websocket = new SockJS("ws://"+websocketPath+"/ws/notifymessage.ws");
}
websocket.onopen = function (evnt) {
};
websocket.onmessage = function (evnt) {
console.log(evnt);
};
websocket.onerror = function (evnt) {
};
websocket.onclose = function (evnt) {
}
</script>
</html>
注意web.xml中配置DispatcherServlet控制器
spring-servlet.xml空文件
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.ws</url-pattern>
</servlet-mapping>
分享到:
相关推荐
相比于HTTP的请求-响应模式,WebSocket允许服务器推送数据到客户端,而无需客户端持续发起请求。 在这个"WebSocket实时通讯,附源码"的压缩包中,我们可以期待找到以下关键知识点: 1. WebSocket握手:源码中应该...
GoEasy利用WebSocket和Comet技术来实现实时推送。WebSocket是一种在客户端和服务器之间建立持久连接的协议,允许双向通信。而Comet则是一种服务器向浏览器推送数据的技术,包括长轮询和流两种方式。GoEasy通过这些...
直接附代码 前端代码: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request....
相比于传统的HTTP协议,WebSocket 改变了客户端和服务器之间的通信模式,使得服务器可以主动向客户端推送数据,提高了实时性。在微信小程序中,官方提供了原生的WebSocket API,包括`wx.connectSocket`、`wx....
当用户发送消息时,调用 WebSocket 的 `send` 方法发送数据,同时接收服务器推送的消息并展示给用户。 总结来说,微信小程序的实时聊天功能可以通过结合 Node.js 和 WebSocket 技术来实现。在服务器端,利用 Node....
- **推送通知**:利用Google的Firebase Cloud Messaging (FCM)或自建推送服务,实现实时的消息推送。 2. **QQServer**: - **服务器架构**:QQServer可能采用分布式系统设计,以应对高并发和大数据量的挑战。 - ...
这需要设计和实现一个评论系统,使用关系型数据库存储评论内容,通过WebSocket实现实时推送,提升用户体验。 4. **权限控制**:为了保护用户隐私和数据安全,平台需要有权限控制机制。Spring Security可以实现角色...
1. **服务器端代码**:这部分代码展示了如何使用Comet4j来创建一个能够主动向客户端推送消息的服务。通常会包含一个Servlet或者Filter,处理来自客户端的请求,并在需要时调用Comet4j的API进行推送。 2. **客户端...
WebSocket提供双向通信,允许服务器主动推送消息到客户端,而AJAX长轮询则是客户端定期向服务器发送请求,检查是否有新的消息。考虑到描述中的“自动”,可能使用的是WebSocket,因为它能提供即时反馈。 2. **消息...
另外,SpringBoot还支持WebSocket,可以实现实时通信,例如推送招聘信息。 在系统设计阶段,我们需要明确系统的需求,包括用户管理、职位发布、应聘申请等功能模块。每个模块的具体实现可以通过服务层(Service ...
- **Persistent Connection**:对于不需要Hub的简单推送,SignalR也提供了一种无状态的连接方式——Persistent Connection。 2. **SignalR的安装与配置** - 使用NuGet包管理器安装`Microsoft.AspNet.SignalR`包。...
- **JavaScript SDK**:SignalR提供了JavaScript客户端库,用于在浏览器中连接到Hub,调用服务器方法和接收服务器推送的消息。 - **.NET客户端**:对于桌面和移动应用,可以使用.NET客户端库,如Core SignalR,...
5. **服务器端调用**:在C#代码中,通过Hub实例调用客户端方法,将消息推送到特定的客户端或所有客户端。 示例源码将帮助你理解SignalR的实际应用场景,通过调试和运行这些示例,你可以更深入地了解如何在实际项目...
ASP.NET SignalR是一种实时通信库,它允许开发者在Web应用程序中轻松实现服务器到客户端的实时推送功能。SignalR是.NET Framework的一部分,适用于构建高度交互式的Web应用,如聊天室、实时图表更新、协同编辑工具等...
然而,AJAX仍然基于请求-响应模型,而SignalR则实现了双向通信,让服务器能主动推送更新。 7. **SignalR的最佳实践** - 使用合适的传输方式:根据目标平台和网络条件选择最优化的传输机制。 - 处理连接生命周期:...
在压缩包中,你可能会发现HTML和JavaScript文件,展示了如何在客户端初始化连接,调用服务器端Hub的方法,以及监听服务器端推送的消息。这部分内容将涵盖jQuery的$.connection对象,以及如何定义和调用hub上的方法。...
11. **通知与消息推送**:介绍如何使用Notification API创建通知,并结合Google的Firebase Cloud Messaging实现远程消息推送。 12. **性能优化**:讲解如何进行内存分析、性能调优,以及使用Lint工具检查代码质量。...
ASP.NET SignalR是一种实时通信库,它允许开发者在Web应用程序中轻松实现服务器到客户端的实时推送功能。SignalR使用多种技术来实现这一点,包括WebSocket、Server-Sent Events、Long Polling等,根据浏览器和服务器...
WebSocket协议允许双向通信,确保客户端和服务器之间能即时交换信息,实现聊天消息的实时推送。 5. **Phoenix Channels**:Phoenix Channels是Phoenix框架中的实时通信组件,它们基于WebSockets,允许在客户端和...