websocket

websocket所需要的依赖

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>

后台代码:
package com.cosmosource.controller.websocket;

import com.cosmosource.core.utils.GetSessionStatementUtil;
import com.cosmosource.core.utils.GetSessionStatusUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

/**

  • @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,

  • 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
    */
    @ServerEndpoint("/websocket")
    public class WebSocketTest {

    private static Logger logger = LoggerFactory.getLogger(WebSocketTest.class);

    //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
    private static int onlineCount = 0;

    //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
    private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet();

    //与某个客户端的连接会话,需要通过它来给客户端发送数据
    private Session session;

    /**

    • 连接建立成功调用的方法
    • @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
      */
      @OnOpen
      public void onOpen(Session session) {
      this.session = session;
      //加入set中
      webSocketSet.add(this);
      //在线数加1
      addOnlineCount();
      // System.out.println(“有新连接加入!当前在线人数为” + getOnlineCount());
      logger.info("[onOpen] 有新连接加入!当前在线人数为[{}]", getOnlineCount());
      }

    /**

    • 连接关闭调用的方法
      */
      @OnClose
      public void onClose() {
      //从set中删除
      webSocketSet.remove(this);
      //在线数减1
      subOnlineCount();
      // System.out.println(“有一连接关闭!当前在线人数为” + getOnlineCount());
      logger.info("[onClose] 有一连接关闭!当前在线人数为[{}]", getOnlineCount());
      }

    /**

    • 收到客户端消息后调用的方法
    • @param message 客户端发送过来的消息
    • @param session 可选的参数
      */
      @OnMessage
      public void onMessage(String message, Session session) {
      // System.out.println(“来自客户端的消息:” + message);
      logger.info("[onMessage] 来自客户端的消息:[{}]", message);
      //群发消息
      for (WebSocketTest item : webSocketSet) {
      try {
      item.sendMessage(message);
      } catch (IOException e) {
      // e.printStackTrace();
      logger.error("[onMessage] error", e);
      continue;
      }
      }
      }

    /**

    • 发生错误时调用
    • @param session
    • @param error
      */
      @OnError
      public void onError(Session session, Throwable error) {
      // System.out.println(“发生错误”);
      logger.info("[onError] 发生错误 error=[{}]", error);
      // error.printStackTrace();
      }

    /**

    • 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。

    • @param message

    • @throws IOException
      */
      public void sendMessage(String message) throws IOException {
      //if(!“undefined”.equalsIgnoreCase(message)){
      if (!message.contains("")) {
      String sessionStatus = GetSessionStatusUtil.getSessionStatus(message);
      // this.session.getBasicRemote().sendText(message);
      this.session.getBasicRemote().sendText(sessionStatus);
      //this.session.getAsyncRemote().sendText(message);
      } else {
      String sessionId = message.substring(0, message.lastIndexOf("
      "));
      String statementId = message.substring(message.lastIndexOf("_") + 1);

       String resultStatus = GetSessionStatementUtil.getSessionStatement(sessionId, statementId);
       this.session.getBasicRemote().sendText(resultStatus);
      

      }
      //}
      }

    public static synchronized int getOnlineCount() {
    return onlineCount;
    }

    public static synchronized void addOnlineCount() {
    WebSocketTest.onlineCount++;
    }

    public static synchronized void subOnlineCount() {
    WebSocketTest.onlineCount–;
    }

}

对象 操作响应时对应取得值
package com.cosmosource.controller.websocket;

import java.io.Serializable;

public class ResultModel implements Serializable {

/**
 * 操作成功的响应码
 * */
public static int RESULT_OK = 0;

/**
 * 操作失败的响应码
 * */
public static int RESULT_FAILURE = 1;

/**
 * 为客户端做toast提示专用
 * */
public static int TOAST_PROMPT = 10;

/**
 * 用户token错误码
 * */
public static int TOKEN_ERROR = -1;

/**
 * 参数错误码
 * */
public static int PARAM_ERROR = -2;

/**
 * 群成员人数不足
 * */
public static int GROUP_MEMBER_ERROR = -3;
/**
 * 含有敏感词
 * */
public static int GROUP_SENSITIVE = -4;

/**
 * 面对面建群超时
 * */
public static int FACE_GROUP_TIMEOUT = -5;

/**
 * 表情数超额
 * */
public static int EXPRESSION_ERROR = -6;

/**
 * 表情已在表情库中
 * */
public static int EXPRESSION_EXIST_ERROR = -7;

/**
 * 表情格式有误
 * */
public static int EXPRESSION_SUFFIX_ERROR = -8;


private static final long serialVersionUID = 13489783434L;

private String message;

/**
 * 返回码
 * */
private int code;

/**
 * 返回数据(请求错误时,返回错误信息)
 * */
private T data;

public ResultModel() {
}

public ResultModel(int code, String message, T data) {
	this.code = code;
	this.message = message;
	this.data = data;
}

public int getCode() {
	return code;
}

public void setCode(int code) {
	this.code = code;
}

public T getData() {
	return data;
}

public void setData(T data) {
	this.data = data;
}

public String getMessage() {
	return message;
}

public void setMessage(String message) {
	this.message = message;
}

}

工具类:
package com.cosmosource.core.utils;

//import com.cosmosource.controller.livy.LivyController;

import com.cosmosource.config.Config;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.utils.HttpClientUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.Map;

public class GetSessionStatusUtil {
/**
* 读取IDP配置
/
private static Config config = new Config(“com.config”);
/
*
* 机器学习 hsot userName passWord
*/
private static String livyUrl = config.getValue(“livy_url”);
private static Logger logger = LoggerFactory.getLogger(GetSessionStatusUtil.class);
// private String livyUrl = “http://192.168.0.152:9999/”;
//private static String livyUrl = “http://192.168.0.152:9998/”;

public static String getSessionStatus(String sessionId) {
    //返回结果
    Map<String, String> resultMap = new HashMap<String, String>();
    //livy请求url(需附件参数)
    String postUrl = null;
    //livy接口
    String url = livyUrl;

// HashMap<String, String> parmaMap = (HashMap<String, String>) consoleParma.getParma();
//方法名字
// String sessionId = parmaMap.get(“sessionId”);
try {
if (StringUtils.isBlank(sessionId)) {
logger.error("[getSessionStatus] 获取session的状态失败,sessionId=[{}]", sessionId);
return null;
// return new ResultModel(ResultModel.PARAM_ERROR, “参数错误”, new HashMap<>());
}
String method = “sessions/” + sessionId + “/state”;
postUrl = url + method;
HttpClientUtil httpClientUtil = new HttpClientUtil();
resultMap = httpClientUtil.getRest(postUrl);
String sessionStatus = resultMap.get(“state”);
logger.info("[getSessionStatus] 获取session的状态成功,sessionId=[{}]", sessionId);
return sessionStatus;
// return new ResultModel(ResultModel.RESULT_OK, “获取session的状态成功”, resultMap);
} catch (Exception e) {
logger.error("[getSessionStatus] 获取session的状态失败,sessionId=[{}]", sessionId);
return null;
// return new ResultModel(ResultModel.PARAM_ERROR, “参数错误”, new HashMap<>());
}
}

}

工具类:
package com.cosmosource.core.utils;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.http.converter.FormHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.xml.SourceHttpMessageConverter;
import org.springframework.web.client.RestTemplate;

import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**

  • @Description: 获取远程服务器 获取需要的状态

  • @Author: 王笑天

  • @CreateDate: 2019/5/13 14:41

  • @UpdateUser: 王笑天

  • @UpdateDate: 2019/5/13 14:41

  • @UpdateRemark: 修改内容

  • @Version: 1.0
    /
    public class HttpClientUtil {
    /

    public String doPost(String url, Map<String,String> map, String charset){
    CloseableHttpClient httpClient = null;
    HttpPost httpPost = null;
    String result = null;
    try{
    httpClient = HttpClients.createDefault();
    httpPost = new HttpPost(url);
    //设置参数
    List list = new ArrayList();
    Iterator iterator = map.entrySet().iterator();
    while(iterator.hasNext()){
    Map.Entry<String,String> elem = (Map.Entry<String, String>) iterator.next();
    list.add(new BasicNameValuePair(elem.getKey(),elem.getValue()));
    }
    if(list.size() > 0){
    UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list,charset);
    httpPost.setEntity(entity);
    }
    HttpResponse response = httpClient.execute(httpPost);
    if(response != null){
    HttpEntity resEntity = response.getEntity();
    if(resEntity != null){
    result = EntityUtils.toString(resEntity,charset);
    }
    }
    }catch(Exception ex){
    ex.printStackTrace();
    }
    return result;
    }
    */

    /**

    • @Author 王笑天
    • @Description
    • @Date 2019/5/13 14:45
    • @Param
    • @return
    • @Throws
      **/
      public Map postRest(String url,Map paramMap) throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
      RestTemplate restTemplate = new RestTemplate();
      List messageConverters=new ArrayList();
      messageConverters.add(new SourceHttpMessageConverter());
      messageConverters.add(new FormHttpMessageConverter());
      messageConverters.add(new MappingJackson2HttpMessageConverter());
      restTemplate.setMessageConverters(messageConverters);
      Map forObject = restTemplate.postForObject(url,paramMap,Map.class);
      return forObject;
      }

    /**

    • @Author 王笑天
    • @Description 删除session
    • @Date 2019/5/13 14:45
    • @Param
    • @return
    • @Throws
      **/
      public void deleteRest(String url,Map paramMap) throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
      RestTemplate restTemplate = new RestTemplate();
      List messageConverters=new ArrayList();
      messageConverters.add(new SourceHttpMessageConverter());
      messageConverters.add(new FormHttpMessageConverter());
      messageConverters.add(new MappingJackson2HttpMessageConverter());
      restTemplate.setMessageConverters(messageConverters);
      restTemplate.delete(url);
      }

    /**

    • @Author 王笑天

    • @Description 获取session状态

    • @Date 2019/5/13 14:44

    • @Param

    • @return

    • @Throws
      **/
      public Map getRest(String url) throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
      RestTemplate restTemplate = new RestTemplate();

      List messageConverters=new ArrayList();
      messageConverters.add(new SourceHttpMessageConverter());
      messageConverters.add(new FormHttpMessageConverter());
      messageConverters.add(new MappingJackson2HttpMessageConverter());
      restTemplate.setMessageConverters(messageConverters);
      Map forObject = restTemplate.getForObject(url,Map.class);

      return forObject;
      }

}

工具类:
package com.cosmosource.core.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.Map;

public class GetSessionStatementUtil {
private static Logger logger = LoggerFactory.getLogger(GetSessionStatementUtil.class);
private static String livyUrl = “http://192.168.0.152:9998/”;

public static  String getSessionStatement(String sessionId,String statementId) {
    //返回结果
    Map<String, String> resultMap = new HashMap<String, String>();
    //livy请求url(需附件参数)
    String postUrl = null;
    //livy接口
    String url = livyUrl;
   // HashMap<String, String> parmaMap = (HashMap<String, String>) consoleParma.getParma();
    try {

// String sessionId = parmaMap.get(“sessionId”);
// String statementId = parmaMap.get(“statementId”);
//方法名字
String method = “sessions/” + sessionId + “/statements/” + statementId;
postUrl = url + method;
HttpClientUtil httpClientUtil = new HttpClientUtil();
resultMap = httpClientUtil.getRest(postUrl);
String resultState=resultMap.get(“state”);
logger.info("[getSessionStatement] 获取session的statement结果成功,sessionId=[{}],statementId=[{}]", sessionId,statementId);
// return new ResultModel(ResultModel.RESULT_OK, “获取session的statement结果成功”, resultMap);
return resultState;
} catch (Exception e) {
logger.error("[getSessionStatement] 获取session的statement结果失败,sessionId=[{}],statementId=[{}]", sessionId,statementId);
// return new ResultModel(ResultModel.RESULT_FAILURE, “获取session的statement结果失败”, new HashMap<>());
return null;
}
}

}

前台代码:
function getSessionStateWebsocket() {
debugger

var websocket = null;
//判断当前浏览器是否支持WebSocket
if ('WebSocket' in window) {
     websocket = new WebSocket("ws://localhost:8089/gdm/websocket");
    //websocket = new WebSocket("ws://"+IPandPortPath.toString()+"/gdm/websocket");
}
else {
    // alert('当前浏览器 Not support websocket');
    // Ext.Msg.alert('提示', '当前浏览器 Not support websocket!', Ext.emptyFn);
    setMessageInnerHTML("当前浏览器 Not support websocket!");


}

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

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

};

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

    if (event.data == "idle") {
        sessionState = "idle";
        closeWebSocket();
        //少个函数么?
        //getResult();
        // document.getElementById("but-run").setAttribute("disabled", true);
        // document.getElementById("but-run").removeAttribute("disabled");
    } else {
        // closeWebSocket();
        send();
    }

    //setMessageInnerHTML(event.data);
};

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

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

//将消息显示在网页上
function setMessageInnerHTML(innerHTML) {
    // document.getElementById('message').innerHTML += innerHTML + '<br/>';
    Ext.Msg.alert('提示', innerHTML, Ext.emptyFn);

    // alert(innerHTML);
    // alert("123");
}

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

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

}

function getResultStateWebsocket() {
var websocketresult = null;
//判断当前浏览器是否支持WebSocket
if (‘WebSocket’ in window) {
websocketresult = new WebSocket(“ws://localhost:8089/gdm/websocket”);
//websocketresult = new WebSocket(“ws://”+IPandPortPath.toString()+"/gdm/websocket");
}
else {
// alert(‘当前浏览器 Not support websocket’);
// Ext.Msg.alert(‘提示’, ‘当前浏览器 Not support websocket!’, Ext.emptyFn);
setMessageInnerHTMLResult(“当前浏览器 Not support websocket!”);

}

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

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

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

    if (event.data == "available") {
        // sessionState ="idle";
        closeWebSocketResult();
        testResult();
        //document.getElementById("but-run").setAttribute("disabled", true);
        // document.getElementById("but-run").removeAttribute("disabled");
    } else {
        // closeWebSocket();
        sendResult();
    }

    //setMessageInnerHTML(event.data);
};

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

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

//将消息显示在网页上
function setMessageInnerHTMLResult(innerHTML) {
    // document.getElementById('message').innerHTML += innerHTML + '<br/>';
    Ext.Msg.alert('提示', innerHTML, Ext.emptyFn);
    // alert(innerHTML);
    // alert("123");
}

//关闭WebSocket连接
function closeWebSocketResult() {
    websocketresult.close();
}

//发送消息
function sendResult() {
    //var message = document.getElementById('text').value;
    var message = sessionId + "_" + statementId;
    websocketresult.send(message);
}


function testResult() {
    Ext.Ajax.request({
        async: false,
        method: "POST",
        url: "/gdm/livy/getSessionStatement",
        defaultPostHeader: "application/json;charset=utf-8",
        params:
        //sql:"select * from default.tbs_20w limit 5;"
        //sql:JSON.stringify(ediotrContent)
            JSON.stringify({
                "parma": {
                    "sessionId": JSON.stringify(sessionId),
                    "statementId": JSON.stringify(statementId)
                }

            })
        //parma:{sql:JSON.stringify(ediotrContent)}
        ,
        success: function (response, opts) {
            //按钮可点击
            $('#but-run').attr("disabled", false);

            var data = Ext.decode(response.responseText);
            var resultList2 = data.data;
            // var sessionId=resultList.id;
            //sessionState=resultList.state;
            //statementId = resultList.id;
            $('#longMsimg').css({
                display: 'none'
            })

            //Ext.Msg.alert(resultList);
            // alert(JSON.stringify(resultList));

            // var con3 = resultList;
            var con3 = JSON.stringify(resultList2);

            // console.log(con3);
            var history = document.getElementById("runHistory");
            history.innerHTML = con3
            // runHistory();
        },

        failure: function (response, opts) {
            Ext.Msg.alert('提示', '获取session的statement结果失败!', Ext.emptyFn);
        }
    });
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值