websocket 实时推消息

package cn.softmr.account.files.service.impl;

import cn.softmr.account.files.module.TbMessage;
import cn.softmr.account.files.module.TbMessageExample;
import cn.softmr.account.files.module.UserLoginInfo;
import cn.softmr.account.files.service.TbFileLogService;
import cn.softmr.account.files.service.TbMessageService;
import cn.softmr.util.Constants;
import cn.softmr.util.DateUtils;
import cn.softmr.util.JWTUtil;
import cn.softmr.util.SpringContextUtil;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.AtomicLong;
@ServerEndpoint("/websocket")
public class MessageWebsocket {  
    private Timer timer;  
    private static AtomicLong socketCount = new AtomicLong();  
    private Session session;
    private static final Logger logger = Logger.getLogger(MessageWebsocket.class);
    //客户端和服务端建立链接的Websocket集合  
    private static CopyOnWriteArraySet<MessageWebsocket> webSocketSet = new CopyOnWriteArraySet<MessageWebsocket>();  
    @Autowired
    protected TbMessageService tbMessageService = (TbMessageService) SpringContextUtil.getBean("tbMessageService");

    @Autowired
    protected TbFileLogService tbFileLogService = (TbFileLogService) SpringContextUtil.getBean("tbFileLogService");

    private static List<Integer> logTypeList=Arrays.asList(Constants.TbFileLogStatus.FILE_CREATE,Constants.TbFileLogStatus.UPLOAD_FILE);
    /** 
     * 建立链接 
     */  
    @OnOpen  
    public void onOpen(Session session){
        logger.info("onOpen===建立链接 === ");
        this.session = session;  
        webSocketSet.add(this);
        String tokenstr = session.getQueryString();
        logger.info("session.getQueryString()"+tokenstr);
        String[] toekn=tokenstr.split("=");
        UserLoginInfo userLoginInfo = JWTUtil.unsign(toekn[1], UserLoginInfo.class);
        if(userLoginInfo!=null) {
            String userId = userLoginInfo.getUserid();
            //启动一个单独的线程,每隔一秒钟推送当前时间到web客户端
            timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    batch(userId);
                }
            }, 0, 1*1000L);
        }
        logger.info("session count is " + socketCount.incrementAndGet());
    }  
      
    /** 
     * 关闭链接 
     */  
    @OnClose  
    public void opClose(){
        logger.info("opClose===关闭链接 ");
        webSocketSet.remove(this);
        if(timer != null){  
            timer.cancel();  
            timer = null;  
        }
        logger.info("session count is " + socketCount.decrementAndGet());
    }  
      
    /** 
     * 服务端接收客户端发来的消息 
     * @param message 
     * @param session 
     */  
    @OnMessage  
    public void onMessage(String message, Session session) {
        logger.info("onMessage==触发==来自客户端的消息:" + message);
        String tokenstr = session.getQueryString();
        System.out.println("session.getQueryString()"+tokenstr);
        String[] toekn=tokenstr.split("=");
        UserLoginInfo userLoginInfo = JWTUtil.unsign(toekn[1], UserLoginInfo.class);
        if(userLoginInfo!=null) {
            String userId = userLoginInfo.getUserid();
            batch(userId);
        }
    }  
    
    /** 
     * 异常处理 
     * @param session 
     * @param error 
     */  
    @OnError  
    public void onError(Session session, Throwable error){
        logger.info("onError===发生错误");
        error.printStackTrace();  
    } 
      
    /** 
     * 往所有web客户端发送消息 
     * @param userId
     */  
    private void batch(String userId){
        try {
           TbMessageExample example=new TbMessageExample();
            example.createCriteria()
                    .andRemark2EqualTo(userId)
                    .andStatusEqualTo(Constants.TbMessageStatus.UN_SEND);
            example.setOrderByClause(" id ");
           List<TbMessage> tbMessagelist = tbMessageService.selectByExample(example);
           if(tbMessagelist.size()>0){
               TbMessage tbMessageUp=new TbMessage();
               tbMessageUp.setStatus(Constants.TbMessageStatus.SEND);
               tbMessageService.updateByExampleSelective(tbMessageUp,example);
               List<TbMessage> tbMessagelist2 = tbMessagelist.size()>5?tbMessagelist.subList(0,5):tbMessagelist;
               for(TbMessage tbMessage:tbMessagelist2){
                   try {
                       Thread.sleep(1000);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
                   String operType = tbMessage.getTitile();
                   String fileNameStr = tbMessage.getContent();
                   Date logDate = tbMessage.getCreateDate();
                   String createUser = tbMessage.getCreateUser();
                   String messageStr = operType+"|"+fileNameStr+"|"+DateUtils.formatDate(logDate)+"|"+createUser;
                   this.sendMessage(messageStr);
               }
           }
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
      
    /** 
     * 发送消息到web客户端 
     * @param message 
     * @throws IOException 
     */  
    public void sendMessage(String message) throws IOException{  
        this.session.getBasicRemote().sendText(message);  
        //this.session.getAsyncRemote().sendText(message);  
    }  
      
     
} 

 

 

 

<%@ page language="java" pageEncoding="UTF-8"%>  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>  
  <head>  
    <title>Web Socket</title>  
  </head>  
  <body>  
    <input id="text" type="text" />  
    <button οnclick="send()">Send</button>      
    <button οnclick="closeWebSocket()">Close</button>  
    <div id="message">  
    </div>  
      
    <script type="text/javascript">  
      var websocket = null;  
         
      if('WebSocket' in window){  
          websocket = new WebSocket("ws://localhost:8081/websocket?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NzI5MjQwMjg4MDMsInBheWxvYWQiOiJ7XCJ1c2VybmFtZVwiOlwi6IC_5piO5piOXCIsXCJ1c2VyaWRcIjpcIjQxMjcyODE5OTAxMTAyNDYzMlwiLFwidXNlcnBzZFwiOlwiMTIzNDU2XCJ9In0.DKGigsNkolCsveM0REPaEDGoA3RV_KsgAXrpMNKFbpI");
      }else{  
          alert('Not support websocket');  
      }  
         
      //连接出现错误,触发该方法  
      websocket.onerror = function(){  
          setMessageInnerHTML("error");  
      };  
         
      //成功建立连接,触发该方法  
      websocket.onopen = function(event){  
          setMessageInnerHTML("连接已建立,可以开始群聊啦!");  
      }  
         
      //客户端收到消息,触发该方法  
      websocket.onmessage = function(event){  
          setMessageInnerHTML(event.data);  
      }  
         
      //连接关闭,触发该方法  
      websocket.onclose = function(){  
          setMessageInnerHTML("连接已关闭!");  
      }  
         
      //窗口关闭时,关闭websocket连接  
      window.onbeforeunload = function(){  
          websocket.close();  
          websocket = null;  
      }  
         
      //将消息显示在网页上  
      var i = 0;  
      function setMessageInnerHTML(innerHTML){  
          document.getElementById('message').innerHTML = innerHTML;  
          ++i;  
          if(i > 20){  
              i = 0;  
             // document.getElementById('message').innerHTML = innerHTML = "";  
          }  
      }  
         
      //关闭连接  
      function closeWebSocket(){  
          websocket.close();  
          websocket = null;  
      }  
         
      //发送消息到服务端  
      function send(){  
          var message = document.getElementById('text').value;  
          websocket.send(message);  
          document.getElementById('text').value = "";  
          document.getElementById('text').focus();  
      }  
  </script>  
  </body>  
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现Python WebSocket实时消息送,你可以使用Tornado或Flask等Web框架,并结合WebSocket协议库(如Tornado的WebSocketHandler或Flask-SocketIO)实现。 以下是一个使用Flask-SocketIO实现实时消息送的示例代码: 1. 安装Flask-SocketIO库: ```bash pip install flask-socketio ``` 2. 创建Flask应用程序并初始化SocketIO: ```python from flask import Flask, render_template from flask_socketio import SocketIO app = Flask(__name__) app.config['SECRET_KEY'] = 'secret!' socketio = SocketIO(app) ``` 3. 定义WebSocket事件处理器: ```python @socketio.on('connect') def handle_connect(): print('Client connected') @socketio.on('message') def handle_message(msg): print('Received message: ' + msg) # 将消息广播给所有客户端 socketio.emit('message', msg) @socketio.on('disconnect') def handle_disconnect(): print('Client disconnected') ``` 4. 在HTML模板中添加WebSocket客户端代码: ```html <!DOCTYPE html> <html> <head> <title>WebSocket Test</title> </head> <body> <h1>WebSocket Test</h1> <input type="text" id="message-input"> <button id="send-button">Send</button> <script src="//code.jquery.com/jquery-1.11.3.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js"></script> <script> var socket = io.connect(); socket.on('connect', function() { console.log('Connected to server'); }); socket.on('message', function(msg) { console.log('Received message: ' + msg); // 在页面上显示收到的消息 $('#message-list').append($('<li>').text(msg)); }); $('#send-button').click(function() { var msg = $('#message-input').val(); socket.send(msg); }); </script> </body> </html> ``` 5. 运行应用程序并访问网页: ```python if __name__ == '__main__': socketio.run(app) ``` 以上是一个基本的WebSocket实时消息送示例,你可以根据自己的需求进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值