配置
me.add(new UrlSkipHandler("^/websocketTest", false));
Java代码
package com.eq.controller.data.shop.message;
import java.io.IOException;
import java.util.concurrent.Callable;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import javax.servlet.http.HttpServletResponse;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import org.apache.log4j.Logger;
import com.alibaba.fastjson.JSONObject;
import com.eq.common.BaseConstants;
import com.eq.common.WebController;
import com.eq.model.user.User;
import com.eq.service.message.WebMessageService;
import com.jfinal.aop.Duang;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.redis.Cache;
import com.jfinal.plugin.redis.Redis;
import com.test.WebSocketTest;
@ServerEndpoint("/websocketTest")
public class WebShopMessageController extends WebController {
// 与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session session;
/**
* 连接建立成功调用的方法
*
* @param session
* 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
*/
@OnOpen
public void onOpen(Session session) {
this.session = session;
while(session != null){
try {
FutureTask<Integer> futrure = new FutureTask<Integer>(new DisposeMessage(session));
new Thread(futrure).start();
futrure.get();
Thread.sleep(3000);
} catch (InterruptedException e) {
session = null;
e.printStackTrace();
} catch (ExecutionException e) {
session = null;
e.printStackTrace();
}
}
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose() {
session = null; // 从set中删除
}
/**
* 收到客户端消息后调用的方法
*
* @param message
* 客户端发送过来的消息
* @param session
* 可选的参数
*/
@OnMessage
public void onMessage(String message, Session session) {
}
/**
* 发生错误时调用
*
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
session = null;
error.printStackTrace();
}
/**
* 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。
*
* @param message
* @throws IOException
*/
public void sendMessage(String message) throws IOException {
}
}
class DisposeMessage implements Callable<Integer> {
private Session session = null;
public DisposeMessage(Session session) {
this.session = session;
}
@Override
public Integer call() throws Exception {
Cache efunCache = Redis.use(BaseConstants.Redis.CACHE_EFUN_DATA);
this.session.getBasicRemote().sendText("新消息啊");
return 1;
}
}
页面
Welcome<br/><input id="text" type="text"/>
<button id="sendMessage">发送消息</button>
<hr/>
<button id="closeWebSocket">关闭WebSocket连接</button>
<div id="message"></div>
/**
* 会员头部页面
*/
$(function() {
$("#sendMessage").click(function(){
send();
})
$("#closeWebSocket").click(function(){
closeWebSocket();
})
var websocket = null;
//判断当前浏览器是否支持WebSocket
if ('WebSocket' in window) {
websocket = new WebSocket("ws://localhost:8090/eq-web/websocketTest");
}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(data) {
$("#message").html($("#message").html()+data+"<br/>");
}
//关闭WebSocket连接
function closeWebSocket() {
websocket.close();
}
//发送消息
function send() {
var message = $("#text").val();
websocket.send(message);
}
});
本文介绍了一个WebSocket应用的具体实现,包括服务端使用Java实现消息处理及客户端交互的完整过程。
2023

被折叠的 条评论
为什么被折叠?



