博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java开发之使用websocket实现web客户端与服务器之间的实时通讯
阅读量:7098 次
发布时间:2019-06-28

本文共 5836 字,大约阅读时间需要 19 分钟。

第一次写博客,有写的不好的地方欢迎大家指点。

使用websocket实现web客户端与服务器之间的实时通讯。以下是个简单的demo。

import java.util.Date;public class WebSocketMessage {    /**     * 发送者ID     */    private String senderId;    /**     * 接受者ID, 如果为0, 则发送给所有人     */    private String receiverId;    /**     * 会话内容     */    private String messageContent;    /**     * 发送时间     */    private Date sendTime;    public String getSenderId() {        return senderId;    }    public void setSenderId(String senderId) {        this.senderId = senderId;    }    public String getReceiverId() {        return receiverId;    }    public void setReceiverId(String receiverId) {        this.receiverId = receiverId;    }    public String getMessageContent() {        return messageContent;    }    public void setMessageContent(String messageContent) {        this.messageContent = messageContent;    }    public Date getSendTime() {        return sendTime;    }    public void setSendTime(Date sendTime) {        this.sendTime = sendTime;    }}
import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;@Controller@RequestMapping("webSocket")public class WebSocketController {    @RequestMapping(value = "messagePage/{userID}")    public ModelAndView messagePage(@PathVariable String userID, HttpServletResponse response) {        ModelAndView mav = new ModelAndView();        mav.addObject("userID", userID);        mav.setViewName("web_socket");        return mav;    }}
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;import com.alibaba.fastjson.JSON;import com.utime.facade.model.systemplate.WebSocketMessage;@ServerEndpoint("/webSocketServer/{userID}")public class WebSocketServer {    // 连接客户端数量    private static int onlineCount = 0;    // 所有的连接客户端    private static Map
clients = new ConcurrentHashMap
(); // 当前客户端连接的唯一标示 private Session session; // 当前客户端连接的用户ID private String userID; /** * 客户端连接服务端回调函数 * * @param userID 用户ID * @param session 会话 * @throws IOException */ @OnOpen public void onOpen(@PathParam("userID") String userID, Session session) throws IOException { this.userID = userID; this.session = session; addOnlineCount(); clients.put(userID, this); System.out.println("WebSocket日志: 有新连接加入!当前在线人数为" + getOnlineCount()); } @OnClose public void onClose() throws IOException { clients.remove(userID); subOnlineCount(); System.out.println("WebSocket日志: 有一连接关闭!当前在线人数为" + getOnlineCount()); } /** * 接受到来自客户端的消息 * * @param message * @throws IOException */ @OnMessage public void onMessage(String message) throws IOException { System.out.println("WebSocket日志: 来自客户端的消息:" + message); WebSocketMessage webSocketMessage = JSON.parseObject(message, WebSocketMessage.class); // 发送消息给所有客户端 if ("0".equals(webSocketMessage.getReceiverId())) { for (WebSocketServer item : clients.values()) { item.session.getAsyncRemote().sendText(webSocketMessage.getMessageContent()); System.out.println("WebSocket日志: ID为"+ webSocketMessage.getSenderId() +"的用户给ID为"+ item.userID +"的客户端发送:" + webSocketMessage.getMessageContent()); } } else { // 发送消息给指定ID的客户端 for (WebSocketServer item : clients.values()) { if (item.userID.equals(webSocketMessage.getReceiverId())){ // 发消息给指定客户端 item.session.getAsyncRemote().sendText(webSocketMessage.getMessageContent()); System.out.println("WebSocket日志: ID为"+ webSocketMessage.getSenderId() +"的用户给ID为"+ item.userID +"的客户端发送:" + webSocketMessage.getMessageContent()); if (!webSocketMessage.getSenderId().equals(webSocketMessage.getReceiverId())) { // 发消息给自己 this.session.getAsyncRemote().sendText(webSocketMessage.getMessageContent()); System.out.println("WebSocket日志: ID为"+ webSocketMessage.getSenderId() +"的用户给ID为"+ this.userID +"的客户端发送:" + webSocketMessage.getMessageContent()); } break; } } } } /** * 服务端报错了 * * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { System.out.println("WebSocket日志: 发生错误"); error.printStackTrace(); } /** * 客户端连接数+1 */ public static synchronized void addOnlineCount() { WebSocketServer.onlineCount++; } /** * 客户端连接数-1 */ public static synchronized void subOnlineCount() { WebSocketServer.onlineCount--; } public static synchronized int getOnlineCount() { return onlineCount; } public static synchronized Map
getClients() { return clients; }}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%><%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%><%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fun"%><%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> 
web_socket Welcome


写这个的目的只是为了自己做个记录。

写的不好,后面会慢慢完善。

转载地址:http://bneql.baihongyu.com/

你可能感兴趣的文章
常用的Linux操作
查看>>
风电场向管理要效益
查看>>
进程监控及管理常用命令
查看>>
echo
查看>>
Myeclise下tomcat启动报错,启动超时
查看>>
Map接口、静态导入、Collections集合工具类
查看>>
Http组件的介绍
查看>>
HDU1043、3567八数码 bfs+康托展开
查看>>
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException
查看>>
蓦然回首
查看>>
[转] Meida视频加密二-Blob对象
查看>>
JavaScript 变量、函数与原型链
查看>>
saltstack Key管理工具-salt-key
查看>>
WWDC19 -224-iOS 13 Presentations 适配
查看>>
Mybatis异常There is no getter for property named 'XXX' in 'class java.lang.String'
查看>>
jQuery初始化
查看>>
[转载]Linux内存高,触发oom-killer问题解决
查看>>
帮助小白快速理解多线程
查看>>
Android系统移植与驱动开发概述
查看>>
Codeforces 432D Prefixes and Suffixes kmp
查看>>