JFinal 使用 WebSocket

发布于 2024-04-29 09:51:24 字数 5130 浏览 33 评论 0

1、先建立一个 Maven 项目,如果是老项目,也可转成 maven 项目。

2、pom.xml 引用相关 jar 包,1.7 之后支持,配置如下:

<dependencies>
<!--<dependency>
		<groupId>javax.websocket</groupId>
		<artifactId>javax.websocket-api</artifactId>
		<version>1.1</version>
		<scope>provided</scope>
	</dependency> -->
	<dependency>
		<groupId>javax</groupId>
		<artifactId>javaee-api</artifactId>
		<version>7.0</version>
		<scope>provided</scope>
	</dependency>
</dependencies>

tomcat7 和 jave EE 1.7 都支持,注意引用一个,不要重复。

3、编写事件拦截处理代码:
ZhiWebSocketHandler.java

package com.yyxz.main;

import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.jfinal.handler.Handler;
import com.jfinal.kit.StrKit;

public class ZhiWebSocketHandler extends Handler {

	private Pattern filterUrlRegxPattern;
	
	public ZhiWebSocketHandler(String filterUrlRegx) {
		if (StrKit.isBlank(filterUrlRegx))
			throw new IllegalArgumentException("The para filterUrlRegx can not be blank.");
		filterUrlRegxPattern = Pattern.compile(filterUrlRegx);
	}
	@Override
	public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
		// TODO Auto-generated method stub
		if (filterUrlRegxPattern.matcher(target).find())
			return ;
		else {
			next.handle(target, request, response, isHandled);
		}
	}

}

在 JFinal Config 中进行注册:

public class DemoConfig extends JFinalConfig {
//...
	public void configHandler(Handlers me) {
		me.add(new ContextPathHandler("ctx"));
		me.add(new ZhiWebSocketHandler("^/websocket"));
// 也可以使用 UrlSkipHandler,就不用编写 Handler 处理类了
//		me.add(new UrlSkipHandler("^/websocket", false));
	}
//...
}

4、后台监听 websocket 代码:
WebSocketController.java

package com.yyxz.controller;

import java.io.IOException;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint("/websocket")
public class WebSocketController {
	public WebSocketController() {
		System.out.println(" WebSocket init~~~");
	}

	@OnOpen
	public void onOpen(Session session) {
		System.out.println("onOpen");
	}

	@OnClose

	public void onClose(Session session) {
		System.out.println("onClose");
	}
	
//	@OnError
//	public void onError(Session session) {
//		System.out.println("onError");
//	}

	@OnMessage
	public void onMessage(String requestJson, Session session)
			throws IOException {
		requestJson = "一一小知回复:" + requestJson; 
		System.out.println(requestJson);
		session.getBasicRemote().sendText(requestJson);
	}
}

5、在前端发起,编写页面:
webSocketTest.jsp

<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!-- for HTML5 -->
<title>Java 后端 WebSocket 的 Tomcat 实现</title>
</head>
<body>
	Welcome
	<br />
	<input id="text" type="text" />
	<button onclick="send()">发送消息</button>
	<hr />
	<button onclick="closeWebSocket()">关闭 WebSocket 连接</button>
	<hr />
	<div id="message"></div>
</body>

<script type="text/javascript">
    var websocket = null;
    //判断当前浏览器是否支持 WebSocket
    if ('WebSocket' in window) {
        websocket = new WebSocket("ws://localhost:8080/yiyixiaozhi/websocket");
    }
    else {
        alert('当前浏览器 Not support websocket')
    }

    //连接发生错误的回调方法
    websocket.onerror = function () {
        setMessageInnerHTML("WebSocket 连接发生错误");
    };

    //连接成功建立的回调方法
    websocket.onopen = function () {
        setMessageInnerHTML("WebSocket 连接成功");
    }

    //接收到消息的回调方法
    websocket.onmessage = function (event) {
        setMessageInnerHTML(event.data);
    }

    //连接关闭的回调方法
    websocket.onclose = function () {
        setMessageInnerHTML("WebSocket 连接关闭");
    }

    //监听窗口关闭事件,当窗口关闭时,主动去关闭 websocket 连接,防止连接还没断开就关闭窗口,server 端会抛异常。
    window.onbeforeunload = function () {
        closeWebSocket();
    }

    //将消息显示在网页上
    function setMessageInnerHTML(innerHTML) {
        document.getElementById('message').innerHTML += innerHTML + '<br/>';
    }

    //关闭 WebSocket 连接
    function closeWebSocket() {
        websocket.close();
    }

    //发送消息
    function send() {
        var message = document.getElementById('text').value;
        websocket.send(message);
    }
</script>
</html>

结果如下:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

空心↖

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

书间行客

文章 0 评论 0

神妖

文章 0 评论 0

undefined

文章 0 评论 0

38169838

文章 0 评论 0

彡翼

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文