Vue+Java 通过websocket实现服务器与客户端双向通信操作


Posted in Javascript onSeptember 22, 2020

1. vue代码

methods: {
 //在方法里调用 this.websocketsend()发送数据给服务器
  onConfirm () {
   //需要传输的数据
    let data = {
     code: 1,
     item: ‘传输的数据'
    }
    this.websocketsend(JSON.stringify(data))
  },
  /*
  */
  initWebSocket () { // 初始化weosocket
   let userinfo = getUserInfo()
   let username = userinfo.waiter_userid
   this.websock = new WebSocket('ws://' + baseURL + '/websocket/' + username)

   this.websock.onmessage = this.websocketonmessage
   this.websock.onerror = this.websocketonerror
   this.websock.onopen = this.websocketonopen
   this.websock.onclose = this.websocketclose
  },
  websocketonopen () { // 连接建立之后执行send方法发送数据
   let data = {
    code: 0,
    msg: '这是client:初次连接'
   }
   this.websocketsend(JSON.stringify(data))
  },
  websocketonerror () { 
   console.log( 'WebSocket连接失败')
  },
  websocketonmessage (e) { // 数据接收
   console.log('数据接收' + e.data)
  },
  websocketsend (Data) { // 数据发送
   this.websock.send(Data)
  },
  websocketclose (e) { // 关闭
   console.log('已关闭连接', e)
  }
 },
 created () {
  console.log('created')
  this.initWebSocket()
 },
 data () {
  return {
   websocket: null
  }
 },
 destroyed () {
  this.websock.close() // 离开路由之后断开websocket连接
 }

2. java代码

项目引入tomcat安装目录里的两个依赖包

Vue+Java 通过websocket实现服务器与客户端双向通信操作

package diancan.servlet;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

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

@ServerEndpoint("/websocket/{username}")
public class WebSocket {

  private static int onlineCount = 0;
  private static Map<String, WebSocket> clients = new ConcurrentHashMap<String, WebSocket>();
  private Session session;
  private String username;

  @OnOpen
  public void onOpen(@PathParam("username") String username, Session session) throws IOException {
  this.username = username;
  this.session = session;

  addOnlineCount();
  clients.put(username, this);
  System.out.println("已连接" + username);
  }

  @OnClose
  public void onClose() throws IOException {
  clients.remove(username);
  subOnlineCount();
  }

  @OnMessage
  public void onMessage(String message) throws IOException {
  DataWrapper res = new DataWrapper();
  System.out.println("message:" + message);
  JSONObject req = JSONObject.parseObject(message);
// System.out.println("item:" + req.getJSONObject("item"));
// System.out.println("item:" + req.getInteger("code"));

  // 发送数据给服务端
  sendMessageAll(JSON.toJSONString(res));
  }

  @OnError
  public void onError(Session session, Throwable error) {
  error.printStackTrace();
  }

  public void sendMessageTo(String message, String To) throws IOException {
  // session.getBasicRemote().sendText(message);
  // session.getAsyncRemote().sendText(message);
  for (WebSocket item : clients.values()) {
   if (item.username.equals(To))
   item.session.getAsyncRemote().sendText(message);
  }
  }

  public void sendMessageAll(String message) throws IOException {
  for (WebSocket item : clients.values()) {
   item.session.getAsyncRemote().sendText(message);
  }
  }

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

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

  public static synchronized void subOnlineCount() {
  WebSocket.onlineCount--;
  }

  public static synchronized Map<String, WebSocket> getClients() {
  return clients;
  }
}

在项目别的类可通过new WebSocket()向客户端发送数据

WebSocket ws = new WebSocket();

ws.sendMessageAll(JSON.toJSONString(rs));

以上这篇Vue+Java 通过websocket实现服务器与客户端双向通信操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
ExtJS4中使用mixins实现多继承示例
Dec 03 Javascript
javascript弹出拖动窗口
Aug 11 Javascript
jquery实现的V字形显示效果代码
Oct 27 Javascript
手机端图片缩放旋转全屏查看PhotoSwipe.js插件实现
Aug 25 Javascript
js实现无缝滚动图(可控制当前滚动的方向)
Feb 22 Javascript
分享一个精简的vue.js 图片lazyload插件实例
Mar 13 Javascript
JS实现简单抖动效果
Jun 01 Javascript
vue-router判断页面未登录自动跳转到登录页的方法示例
Nov 04 Javascript
layui 富文本赋值,取值,取纯文本值的实例
Sep 18 Javascript
jquery validate 实现动态增加/删除验证规则操作示例
Oct 28 jQuery
Javascript原生ajax请求代码实例
Feb 20 Javascript
前端JavaScript大管家 package.json
Nov 02 Javascript
Vue实现开关按钮拖拽效果
Sep 22 #Javascript
JS如何生成动态列表
Sep 22 #Javascript
vue使用svg文件补充-svg放大缩小操作(使用d3.js)
Sep 22 #Javascript
解决Can't find variable: SockJS vue项目的问题
Sep 22 #Javascript
解决vue-router 嵌套路由没反应的问题
Sep 22 #Javascript
Js跳出两级循环方法代码实例
Sep 22 #Javascript
vue 二维码长按保存和复制内容操作
Sep 22 #Javascript
You might like
html中select语句读取mysql表中内容
2006/10/09 PHP
php strlen mb_strlen计算中英文混排字符串长度
2009/07/10 PHP
php流量统计功能的实现代码
2012/09/29 PHP
浅谈PHP中类和对象的相关函数
2017/04/26 PHP
php变量与JS变量实现不通过跳转直接交互的方法
2017/08/25 PHP
Laravel框架基于ajax实现二级联动功能示例
2019/01/17 PHP
JavaScript 使用技巧精萃(.net html
2009/04/25 Javascript
js中将字符串转换成json的三种方式
2011/01/12 Javascript
javascript中Date对象应用之简易日历实现
2016/07/12 Javascript
详解Angular2表单-模板驱动的表单(Template-Driven Forms)
2017/08/04 Javascript
新手vue构建单页面应用实例代码
2017/09/18 Javascript
MUI 实现侧滑菜单及其主体部分上下滑动的方法
2018/01/25 Javascript
JavaScript中字符串的常用操作方法及特殊字符
2018/03/18 Javascript
vue多层嵌套路由实例分析
2019/03/19 Javascript
vue中使用GraphQL的实例代码
2019/11/04 Javascript
js实现点击生成随机div
2020/01/16 Javascript
Vue引入Stylus知识点总结
2020/01/16 Javascript
原生js实现碰撞检测
2020/03/12 Javascript
[56:42]完美世界DOTA2联赛循环赛 Matador vs Forest 第二场 11.06
2020/11/06 DOTA
[10:05]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD 选手采访
2021/03/11 DOTA
详解Python中for循环的使用方法
2015/05/14 Python
Python 正则表达式入门(初级篇)
2016/12/07 Python
Python数据结构之单链表详解
2017/09/12 Python
python里使用正则的findall函数的实例详解
2017/10/19 Python
Python+OpenCV让电脑帮你玩微信跳一跳
2018/01/04 Python
wxPython+Matplotlib绘制折线图表
2019/11/19 Python
python求质数列表的例子
2019/11/24 Python
Python实现银行账户资金交易管理系统
2020/01/03 Python
详解Python 最短匹配模式
2020/07/29 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
2021/03/04 Python
高级人员简历的自我评价分享
2013/11/03 职场文书
晚会主持词开场白
2014/03/17 职场文书
国家税务局领导班子对照检查材料思想汇报
2014/10/04 职场文书
学校拾金不昧表扬信
2015/01/16 职场文书
超市主管竞聘书
2015/09/15 职场文书
《称赞》教学反思
2016/02/17 职场文书