簡體   English   中英

如何調用websocket服務器在春天將消息發送到客戶端

[英]How to call the websocket server to sends the message to the client in spring

我的項目使用spring框架

WebSocketConfig.java

@Configuration
@EnableWebMvc
@EnableWebSocket
public class WebSocketConfig extends WebMvcConfigurerAdapter implements  WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
         registry.addHandler(systemWebSocketHandler(),"/webSocketServer").addInterceptors(new   WebSocketHandshakeInterceptor());

         registry.addHandler(systemWebSocketHandler(), "/sockjs/webSocketServer").addInterceptors(new WebSocketHandshakeInterceptor())
            .withSockJS();
    }

    @Bean
    public WebSocketHandler systemWebSocketHandler(){
        return new SystemWebSocketHandler();
    }

}

SystemWebSocketHandler.java

public class SystemWebSocketHandler implements WebSocketHandler {

private static final Logger logger;

private static final ArrayList<WebSocketSession> users;

static {
    users = new ArrayList<>();
    logger = LoggerFactory.getLogger(SystemWebSocketHandler.class);
}

@Autowired
private WebSocketService webSocketService;

@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
    logger.debug("connect to the websocket success......");
    users.add(session);
    String userName = (String) session.getAttributes().get(Constants.WEBSOCKET_USERNAME);
    //查詢未讀消息
    int count = webSocketService.getUnReadNews((String)session.getAttributes().get(Constants.WEBSOCKET_USERNAME));

    session.sendMessage(new TextMessage(count+""));
}

@Override
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {

}

@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
    logger.debug("websocket connection closed......");
    users.remove(session);
}

@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
    logger.debug("websocket connection closed......");
    users.remove(session);
}

@Override
public boolean supportsPartialMessages() {
    return false;
}

/**
 * 給所有在線用戶發送消息
 *
 * @param message
 */
public void sendMessageToUsers(TextMessage message) {
    for (WebSocketSession user : users) {
        try {
            if (user.isOpen()) {
                user.sendMessage(message);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

/**
 * 給某個用戶發送消息
 *
 * @param userName
 * @param message
 */
public void sendMessageToUser(String userName, TextMessage message) {
    for (WebSocketSession user : users) {
        if (user.getAttributes().get(Constants.WEBSOCKET_USERNAME).equals(userName)) {
            try {
                if (user.isOpen()) {
                    user.sendMessage(message);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            break;
        }
    }
}
}

我的jsp客戶端

if ('WebSocket' in window) {
            websocket = new WebSocket("ws://localhost:8080/Origami/webSocketServer");
        } else if ('MozWebSocket' in window) {
            websocket = new MozWebSocket("ws://localhost:8080/Origami/webSocketServer");
        } else {
            websocket = new SockJS("http://localhost:8080/Origami/sockjs/webSocketServer");
        }

這是我的websocket代碼,它運行良好

現在我想在控制器中向客戶端發送消息,這是我的控制器

@Controller
public class AdminController {

static Logger logger = LoggerFactory.getLogger(AdminController.class);

@Autowired(required = false)
private AdminService adminService;

@Autowired(required = false)
private SystemWebSocketHandler systemWebSocketHandler;

@RequestMapping("/auditing")
@ResponseBody
public String auditing(HttpServletRequest request){
    String result = "fail";
    int id = Integer.parseInt(request.getParameter("id"));
    String reason = request.getParameter("reason");
    String title = request.getParameter("title");
    String username = request.getParameter("username");
    News news = new News();
    DateTime dateTime = DateTime.now();
    news.setNewsTime(dateTime.toDate());
    news.setState(0);
    news.setUsername(username);
    if(reason.equals("")){
        result = adminService.auditingById(id,"Y");
        news.setNewsContent(String.format(Constants.AUDIT_MESSAGE, username, title, reason));
        adminService.addNewsWithUnAudit(news);
    }else{
        news.setNewsContent(String.format(Constants.UN_AUDIT_MESSAGE,username,title,reason));
        result = adminService.addNewsWithUnAudit(news);
        result = adminService.auditingById(id, "D");
    }
    //SystemServerEndPoint serverEndPoint = new SystemServerEndPoint();
    int unReadNewsCount = adminService.getUnReadNews(username);
    systemWebSocketHandler.sendMessageToUser(username, new TextMessage(unReadNewsCount + ""));
    return result;
}
}

我想打電話

systemWebSocketHandler.sendMessageToUser(username, new TextMessage(unReadNewsCount + ""));

向客戶端發送消息但systemWebSocketHandler為null

如何將systemWebSocketHandler注入控制器或其他一些想法來完成所需? 例如服務器連接到websocketserver時需要向客戶端發送消息並在完成時關閉

我的英語很差,但我正在努力學習

我已經解決了這個問題

@Controller
public class AdminController {

@Bean
public SystemWebSocketHandler systemWebSocketHandler() {
    return new SystemWebSocketHandler();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM