JAVA中实现websockt一对一聊天

WebSocketConfig 配置

/*** 开启WebSocket支持* @author*/
@Configuration
public class WebSocketConfig {@Bean@Conditional(WarAndJarWebscoketAutoWired.class)//自动根据情况装配beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}}

WarAndJarWebscoketAutoWired

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;/*** 判断是否使用webscoket容器,如果使用的是本地开发环境就装配bean(非开发环境都是外部tomcat,不需要装配这个bean),使用方式@Conditional(WarAndJarWebscoketAutoWired.class)*/
public class WarAndJarWebscoketAutoWired implements Condition {public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {Environment env = context.getEnvironment();String active = env.getProperty("spring.profiles.active");//               return !packageStyle.equals("war");return (active.equals("dev"));}
}

WebSocketServer 部分代码:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.CrossOrigin;import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;/*** @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,* 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端* @author fengtao.xue*/
@Component
@CrossOrigin
@ServerEndpoint("/crm/websocket/{userId}")
public class WebSocketServer {static Logger logger = LoggerFactory.getLogger(WebSocketServer.class);//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。private static final AtomicInteger OnlineCount = new AtomicInteger(0);//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识private static ConcurrentHashMap<String, WebSocketServer> webSocketSet = new ConcurrentHashMap<String,WebSocketServer>();//与某个客户端的连接会话,需要通过它来给客户端发送数据private Session WebSocketsession;//当前发消息的人员userIdprivate String userId = "";public Session getWebSocketsession() {return WebSocketsession;}public void setWebSocketsession(Session webSocketsession) {WebSocketsession = webSocketsession;}/*** 从set中删除* 删除 WebSocket 用户* @param userId*/public void remove(String userId){webSocketSet.remove(userId);}public static Collection<WebSocketServer> getValues(){return webSocketSet.values();}/*** 连接建立成功调用的方法*/@OnOpenpublic void onOpen(@PathParam(value = "userId") String param, Session webSocketsession, EndpointConfig config) {userId = param;this.WebSocketsession = webSocketsession;this.WebSocketsession = WebSocketsession;webSocketSet.put(param, this);//加入map中int cnt = OnlineCount.incrementAndGet(); // 在线数加1logger.info("有连接加入{},当前连接数为:{}",param, cnt);logger.info("有连接加入,当前连接数为:{}", cnt);//sendMessage(this.WebSocketsession, "连接成功");}/*** 连接关闭调用的方法*/@OnClosepublic void onClose() {if (!userId.equals("")){webSocketSet.remove(userId);//从set中删除int cnt = OnlineCount.decrementAndGet();logger.info("有连接关闭{},当前连接数为:{}",userId, cnt);logger.info("有连接关闭,当前连接数为:{}", cnt);}}/*** 收到客户端消息后调用的方法* @param message 客户端发送过来的消息*/@OnMessagepublic void onMessage(String message, Session session) {logger.info("来自客户端的消息:{}",message);sendMessage(session, "收到消息,消息内容:"+message);}/*** 发生错误后调用的方法* @param session* @param error*/@OnErrorpublic void onError(Session session, Throwable error) {logger.error("发生错误:{},Session ID: {}",error.getMessage(),session.getId());error.printStackTrace();}/*** 发送消息,实践表明,每次浏览器刷新,session会发生变化。* @param message*/public void sendMessage(Session session, String message) {try {session.getBasicRemote().sendText(message);//session.getBasicRemote().sendText(String.format("%s",message));} catch (IOException e) {logger.error("发送消息出错:{}", e.getMessage());e.printStackTrace();}}/*** 群发消息* @param message* @throws IOException*/public void broadCastInfo(String message) {for (String key : webSocketSet.keySet()) {Session session = webSocketSet.get(key).WebSocketsession;if(session != null && session.isOpen() && !userId.equals(key)){sendMessage(session, message);}}}/*** 指定Session发送消息* @param message* @throws IOException*/public void sendToUser(String userId, String message) {getSocketUser();logger.info("发送消息:userId"+userId);WebSocketServer webSocketServer = webSocketSet.get(userId);if ( webSocketServer != null && webSocketServer.WebSocketsession.isOpen()){sendMessage(webSocketServer.WebSocketsession, message);}else{logger.warn("当前用户不在线:{}",userId);}}/*** 获取 Socket 的连接用户* @return*/public List<String> getSocketUser() {List<String> userIds= webSocketSet.keySet().stream().collect(Collectors.toList());logger.warn("当前Socket的连接用户:{}",userIds);return userIds;}
}

相关文章

vue中websocket心跳机制

JAVA中webSockt一对一聊天相关推荐

  1. 【Java线程】简单实现带界面的一对一聊天

    实现原理: 1.构建好窗体,在窗体中创建好相应的布局和控件: 2.为相应的控件(按钮:监听.连接.发送)添加事件: 3.使用到两个线程: a.监听线程:获取服务器端输入的端口号,构建socket,监听 ...

  2. Java网络编程,一对一聊天

    Java网络编程,一对一聊天 **这个小任务是来自于B站,他的视频名字就是"Java实现实时聊天互动程序"** 要求:就是有2个类,其中一个客户端和一个服务端.要实现从客户端发消息 ...

  3. 微信升级最新版本后,可在一对一聊天场景中访问外部链接

    9月17日消息,据微信发布的消息,近期,工信部对外链管理提出了专项指导意见,微信将落实"以安全为底线"的互联互通,为确保高质量的平台内容和良好的用户体验,整体遵循如下外链开放原则: ...

  4. java 直播_一对一直播源码开发过程中区分Java和PHP的重要性

    开发一对一直播源码光有热情可是不够的,还需要对技术有点了解.除了懂点基本的后台操作外,得先明白一对一直播源码选择Java还是PHP?两者之中那个会更好.今天同创小编主要就是给大家介绍一下两者之间的区别 ...

  5. 浅谈java中的ServerSocket和Socket的通信原理实现聊天及多人聊天

    聊天,QQ,微信,陌陌很多的即时通讯的软件,不管是桌面端还是移动端,在当今社交的时代都是不可或缺的一部分.这时候说Socket和ServerSocket感觉有点老调重弹感觉,相信很多人早就知道如何使用 ...

  6. Java websocket + redis 实现多人单聊天室,多人多聊天室, 一对一聊天

    多人,单聊天室版 FEATURE 多人聊天, 界面简洁美观, 使用ueditor支持发送文字,图片信息 群聊成员列表, 登入登出公告 存储聊天记录, 查看历史消息 技术点 使用CopyOnWriteM ...

  7. java用socket和serversocket实现一对一聊天(java实现简单的TCP聊天程序)

    在上次发表类似文章的基础上做了一点手脚,这次可以直接运行两个控制台,不用再去用telnet IP端口了,这个可以直接在eclipse分别执行服务器端类和客户端类,然后在客户端和服务端上进行交互.更为方 ...

  8. 一对一聊天ajax实现

    前端页面: 好友列表: 好友列表代码: <%@ page language="java" contentType="text/html; charset=UTF-8 ...

  9. GOF23种设计模式在Java中的应用(part 3)

    本文接续:GOF23种设计模式在Java中的应用(part 2) 行为型模式 行为型模式关注系统中对象之间的相互交互.,研究系统在运行时对象之间的相互通信和协作,进一步明确对象的职责,共有11种模式. ...

最新文章

  1. java urlstreamhandler_获取对Java的默认http(s)URLStreamHandler的引用
  2. 零基础掌握极大似然估计
  3. jython在MyEclipse控制台出现Failed to install
  4. 解决上传文件或图片时选择相同文件无法触发change事件的问题
  5. 代码审计-四叶草杯线下awd比赛源码web2
  6. 第十一届蓝桥杯java B组第二场-试题A: 门牌制作
  7. 2009年出现的计算机术语,2009年计算机一级考试真题及答案
  8. 前端开发中使用mock模拟数据
  9. 深入理解session过期机制
  10. html坐标轴背景色,CSS 背景(css background)
  11. Activiti 6中的可插拔持久性
  12. 软件测试 学习之路 CSS (二)
  13. 基于Xilinx Spartan-7 FPGA实现SMC接口
  14. 弹窗设计UI素材模板|带你了解下弹窗特性
  15. 关于如何学好前端开发,你需要知道的事!
  16. Android开发笔记(十)常用的图片加工操作
  17. 洛谷 P2181 对角线
  18. matlab单层感知器画线,MATLAB神经网络学习(1):单层感知器
  19. 2015总结与新年计划
  20. 放心吧,社区团购是兔子的尾巴长不了

热门文章

  1. 视频点播服务器的配置如何选择,需要多大的带宽
  2. R语言(R studio)画各类统计图形
  3. P2071 座位安排
  4. Golang 项目配置文件读取之 viper 实践
  5. Android Qcom USB Driver学习(六)
  6. Liam的操作系统学习历程(一):xv6 homework 9 Barriers
  7. 网络编程(3)-----------Javaweb
  8. 用joern画AST、CFG、CDG、DDG、PDG、CPG
  9. 今天老夫就把完全背包的底裤给你扒出来瞅瞅!!!
  10. Atlas:手淘Native容器化框架和思考