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

websocket

    • 1. vue代码
    • 2. java代码

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安装目录里的两个依赖包
在这里插入图片描述
在这里插入图片描述

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 clients = new ConcurrentHashMap();
   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 getClients() {
   	return clients;
   }
}

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

WebSocket ws = new WebSocket();
ws.sendMessageAll(JSON.toJSONString(rs));

你可能感兴趣的:(Vue,Java,websocket)