欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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聊天室(spring websocket)     javaweb聊天室(spring websocket)

用javaweb技术实现网络聊天室,即提供多人通过文字与命令进行实时交谈、聊天的网页,并且实时显示在线用户。

演示:http://120.78.164.110:8080/Chatrum/rum/chat.html

源码:https://github.com/Vimmone/Chatrum