`

SpringMVC+HTML5+websocket即时聊天Demo

阅读更多

websocket的通信形式今天刚学,好处就不说了,网上有很多,下面把写的即时通信的demo记录下来,运行出来像下面一样:



 一、spring必须4.0以上,maven的pom文件如下:

 

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>4.2.4.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>4.2.4.RELEASE</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-websocket</artifactId>
			<version>4.2.4.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-messaging</artifactId>
			<version>4.2.4.RELEASE</version>
		</dependency>

当然了,还有servlet等等了。。。那些就自己查了

 

二、spring中,关于websocket的配置:

 

	<bean id="websocket" class="com.wang.test.websocket.demo.WebSocketHander" />

	<websocket:handlers>
		<websocket:mapping path="/echo" handler="websocket" />
		<websocket:handshake-interceptors>
			<bean class="com.wang.test.websocket.demo.HandshakeInterceptor" />
		</websocket:handshake-interceptors>
	</websocket:handlers>

 不要忘记引入xsd文件,

 

 

http://www.springframework.org/schema/websocket
http://www.springframework.org/schema/websocket/spring-websocket-4.0.xsd

 整个关于websocket的配置文件如下:

 

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:websocket="http://www.springframework.org/schema/websocket"
	xsi:schemaLocation="
       http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/websocket
       http://www.springframework.org/schema/websocket/spring-websocket-4.0.xsd">
	
	<bean id="websocket" class="com.wang.test.websocket.demo.WebSocketHander" />

	<websocket:handlers>
		<websocket:mapping path="/echo" handler="websocket" />
		<websocket:handshake-interceptors>
			<bean class="com.wang.test.websocket.demo.HandshakeInterceptor" />
		</websocket:handshake-interceptors>
	</websocket:handlers>

</beans>

 三、Interceptor类

 

 

package com.wang.test.websocket.demo;

import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.socket.WebSocketHandler;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

public class HandshakeInterceptor implements org.springframework.web.socket.server.HandshakeInterceptor{
	// 初次握手访问前
	@Override
	public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse serverHttpResponse,
			WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {
		if (request instanceof ServletServerHttpRequest) {
			HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest();
			String userName = "xq";
			// 使用userName区分WebSocketHandler,以便定向发送消息
			// String userName = (String)
			// session.getAttribute("WEBSOCKET_USERNAME");
			map.put("WEBSOCKET_USERNAME", userName);
			servletRequest.getSession().setAttribute("WEBSOCKET_USERNAME", userName);
		}
		return true;
	}

	// 初次握手访问后
	@Override
	public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse,
			WebSocketHandler webSocketHandler, Exception e) {

	}
}

 四、WebSocketHander类

 

 

package com.wang.test.websocket.demo;

import org.apache.log4j.Logger;
import org.springframework.web.socket.*;

import java.io.IOException;
import java.util.ArrayList;

public class WebSocketHander implements WebSocketHandler {
	
	private static final Logger logger = Logger.getLogger(WebSocketHander.class);

	private static final ArrayList<WebSocketSession> users = new ArrayList<>();

	// 初次链接成功执行
	@Override
	public void afterConnectionEstablished(WebSocketSession session) throws Exception {
		logger.debug("链接成功......");
		users.add(session);
		String userName = (String) session.getAttributes().get("WEBSOCKET_USERNAME");
		if (userName != null) {
			// 查询未读消息
			int count = 5;
			session.sendMessage(new TextMessage(count + ""));
		}
	}

	// 接受消息处理消息
	@Override
	public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage)
			throws Exception {
		sendMessageToUsers(new TextMessage(webSocketMessage.getPayload() + ""));
	}

	@Override
	public void handleTransportError(WebSocketSession webSocketSession, Throwable throwable) throws Exception {
		if (webSocketSession.isOpen()) {
			webSocketSession.close();
		}
		logger.debug("链接出错,关闭链接......");
		users.remove(webSocketSession);
	}

	@Override
	public void afterConnectionClosed(WebSocketSession webSocketSession, CloseStatus closeStatus) throws Exception {
		logger.debug("链接关闭......" + closeStatus.toString());
		users.remove(webSocketSession);
	}

	@Override
	public boolean supportsPartialMessages() {
		return false;
	}

	/**
	 * 给所有在线用户发送消息
	 *
	 * @param message
	 */
	public void sendMessageToUsers(TextMessage message) {
		for (WebSocketSession user : users) {
			try {
				if (user.isOpen()) {
					user.sendMessage(message);
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 给某个用户发送消息
	 *
	 * @param userName
	 * @param message
	 */
	public void sendMessageToUser(String userName, TextMessage message) {
		for (WebSocketSession user : users) {
			if (user.getAttributes().get("WEBSOCKET_USERNAME").equals(userName)) {
				try {
					if (user.isOpen()) {
						user.sendMessage(message);
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
				break;
			}
		}
	}
}

 五、页面显示文件:

 

 

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<script src="http://cdn.sockjs.org/sockjs-0.3.min.js"></script>
<!-- 新 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
<!-- 可选的Bootstrap主题文件(一般不用引入) -->
<link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
<!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
<script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<title>webSocket测试</title>
<script type="text/javascript">
	$(function() {
		var websocket;
		if ('WebSocket' in window) {
			alert("WebSocket");
			var url = 'ws://' + window.location.host + '/SSMTest/echo';
			websocket = new WebSocket(url);
			//websocket = new WebSocket("ws://127.0.0.1:8080/SSMTest/echo");
		} else if ('MozWebSocket' in window) {
			alert("MozWebSocket");
			websocket = new MozWebSocket("ws://echo");
		} else {
			alert("SockJS");
			websocket = new SockJS("http://127.0.0.1:8080/SSMTest/sockjs/echo");
		}
		websocket.onopen = function(evnt) {
			$("#tou").html("链接服务器成功!")
		};
		websocket.onmessage = function(evnt) {
			$("#msg").html($("#msg").html() + "<br/>" + evnt.data);
		};
		websocket.onerror = function(evnt) {
		};
		websocket.onclose = function(evnt) {
			$("#tou").html("与服务器断开了链接!")
		}
		$('#send').bind('click', function() {
			send();
		});
		function send() {
			if (websocket != null) {
				var message = document.getElementById('message').value;
				websocket.send(message);
			} else {
				alert('未与服务器链接.');
			}
		}
	});
</script>

</head>
<body>

	<div class="page-header" id="tou">webSocket及时聊天Demo程序</div>
	<div class="well" id="msg"></div>
	<div class="col-lg">
		<div class="input-group">
			<input type="text" class="form-control" placeholder="发送信息..."
				id="message"> <span class="input-group-btn">
				<button class="btn btn-default" type="button" id="send">发送</button>
			</span>
		</div>
		<!-- /input-group -->
	</div>
	<!-- /.col-lg-6 -->
	</div>
	<!-- /.row -->
</body>
</html>

 六、参考:http://blog.csdn.net/mr_zhuqiang/article/details/46618197  把这里面配置形式改了

 七、代码地址:https://github.com/hejiawang/SSMTest

 

 

  • 大小: 48.5 KB
1
5
分享到:
评论

相关推荐

    Maven+SpringMVC+MyBatis+Logback+WebSocket

    本项目采用了一种常见的技术栈:“Maven+SpringMVC+MyBatis+Logback+WebSocket”,这是一套强大的组合,适合快速开发中大型企业级应用。接下来,我们将详细探讨这些技术及其相互间的协同工作。 1. Maven: Maven是...

    springmvc+websocket demo

    在"springmvc+websocket demo"项目中,Spring MVC和WebSocket被结合使用,实现了一种实时交互的功能。首先,Spring MVC用于处理HTTP请求,例如用户登录、页面跳转等非实时交互任务。然后,当需要实现实时通信,如...

    SpringMVC+ webSocket

    综上所述,SpringMVC+WebSocket的组合可以有效地构建出实时的聊天应用,利用SpringMVC的强项处理HTTP请求,结合WebSocket实现双向实时通信。这种技术栈不仅在性能上满足了需求,而且在开发和维护上也具有很高的灵活...

    spring4+springmvc+hibernate3 整合demo

    本项目"spring4+springmvc+hibernate3 整合demo"提供了一个完整的示例,帮助初学者理解和学习这三大框架的集成与应用。 首先,Spring Framework(简称Spring)是一个开源的应用框架,它以依赖注入(Dependency ...

    DWZ+springMvc+hibernate+ehcache 简易的后台管理+即时通讯

    标题中的“DWZ+springMvc+hibernate+ehcache 简易的后台管理+即时通讯”揭示了这个项目采用的技术栈,包括前端框架、后端框架、持久层框架以及缓存管理工具。让我们逐一深入理解这些技术点: 1. **DWZ**:DWZ全称为...

    webRTC视讯聊天

    框架:springmvc+websocket+maven+webrtc websocket参考: http://www.html5rocks.com/en/tutorials/websockets/basics/ springmvc+websocket参考: ... webrtc参考: ...https://server:8443/webchat/sr.html ...

    spring4+springmvc4+hibernate4 整合DEMO

    在"spring4+springmvc4+hibernate4 整合DEMO"中,我们通常会经历以下步骤: 1. **配置环境**:设置项目的pom.xml文件,引入这三个框架的依赖库,确保项目构建成功。 2. **初始化Spring**:创建Spring的配置文件...

    spring4.1.3+mybatis3.2.8+springmvc+mysql8.0.11的模板

    这是一个基于SSM(Spring、SpringMVC、MyBatis)框架和MySQL数据库的项目模板,适用于初学者或者快速开发环境的搭建。以下是关于这个模板及其所涉及技术的详细知识点: 1. **Spring 4.1.3**: Spring是Java企业级...

    Shiro + Hibernate5 + Spring5 + SpringMVC5 的jar

    标题中的"Shiro + Hibernate5 + Spring5 + SpringMVC5 的jar"指的是一个整合了四个关键Java技术的库文件,这些技术分别是Apache Shiro、Hibernate5、Spring5和SpringMVC5。这个压缩包可能包含了这四个框架的最新版本...

    Spring+STOMP实现WebSocket广播订阅、权限认证、一对一通讯

    WebSocket API是HTML5的一个特性,它允许服务端主动向客户端发送数据,解决了HTTP协议下服务器无法主动推送的问题。Spring框架提供了WebSocket的支持,通过WebSocketEndpoint接口,开发者可以定义处理WebSocket消息...

    麻雀小五脏全的SSM框架和websocket技术的整合小demo

    这个小型的SSM+WebSocket demo,虽然规模不大,但它涵盖了从服务器端配置到客户端实现的全过程,是学习WebSocket与现有Java Web框架整合的宝贵资源。通过这个项目,开发者可以深入理解WebSocket的工作原理,以及如何...

    websocket整合spring

    在Eclipse中新建一个Web项目,命名为“demo_websocket”。 ##### 2. 导入必需的jar包 - `javax.servlet-api.jar` - `org.apache.tomcat.websocket-api.jar` - `org.springframework.web.socket.server.jar` - `org...

    springboot+hibernate+thymeleaf分页增删改查demo

    SpringBoot是Spring框架的一种快速开发工具,它集成了大量常用的第三方库配置,如JPA、Thymeleaf、WebSocket等,极大地简化了Spring应用的初始搭建以及开发过程。本项目结合Hibernate,一个强大的ORM(对象关系映射...

    Spring 5 + Spring MVC 5 + MyBatis 3 整合.zip

    本项目提供了基于Spring 5.2.2.RELEASE、SpringMVC 5.2.2.RELEASE和MyBatis 3.5.2的整合示例,名为"ssm-demo",旨在帮助开发者理解如何将这些框架协同工作。 首先,Spring框架是整个SSM架构的核心,它提供依赖注入...

Global site tag (gtag.js) - Google Analytics