首页
关于
壁纸
直播
留言
友链
统计
Search
1
《三国志英杰传》攻略
6,034 阅读
2
Emby客户端IOS破解
5,767 阅读
3
白嫖Emby
5,764 阅读
4
《吞食天地1》金手指代码
4,691 阅读
5
破解emby-server
4,039 阅读
moonjerx
game
age-of-empires
zx3
san-guo-zhi
尼尔:机械纪元
net
emby
learn-video
docker
torrent
photoshop
route
minio
git
ffmpeg
im
vue
gitlab
typecho
svn
alipay
nasm
srs
mail-server
tailscale
kkfileview
aria2
webdav
synology
redis
oray
chemical
mxsite
math
π
x-ui
digital-currency
server
nginx
baota
k8s
http
cloud
linux
shell
database
vpn
esxi
rancher
domain
k3s
ewomail
os
android
windows
ios
app-store
macos
develop
java
javascript
uniapp
nodejs
hbuildx
maven
android-studio
jetbrain
jenkins
css
mybatis
php
python
hardware
hard-disk
pc
RAM
software
pt
calibre
notion
office
language
literature
philosophy
travel
登录
Search
标签搜索
ubuntu
mysql
openwrt
zerotier
springboot
centos
openvpn
jdk
吞食天地2
synology
spring
idea
windows11
吞食天地1
transmission
google-play
Japanese
xcode
群晖
kiftd
MoonjerX
累计撰写
370
篇文章
累计收到
459
条评论
首页
栏目
moonjerx
game
age-of-empires
zx3
san-guo-zhi
尼尔:机械纪元
net
emby
learn-video
docker
torrent
photoshop
route
minio
git
ffmpeg
im
vue
gitlab
typecho
svn
alipay
nasm
srs
mail-server
tailscale
kkfileview
aria2
webdav
synology
redis
oray
chemical
mxsite
math
π
x-ui
digital-currency
server
nginx
baota
k8s
http
cloud
linux
shell
database
vpn
esxi
rancher
domain
k3s
ewomail
os
android
windows
ios
app-store
macos
develop
java
javascript
uniapp
nodejs
hbuildx
maven
android-studio
jetbrain
jenkins
css
mybatis
php
python
hardware
hard-disk
pc
RAM
software
pt
calibre
notion
office
language
literature
philosophy
travel
页面
关于
壁纸
直播
留言
友链
统计
搜索到
24
篇与
java
的结果
2024-11-11
Java面试一
面试概况本次面试为快手商业化部门日常实习生的一轮面试,面试时长约为40分钟。面试内容主要集中在Java基础知识、数据库、并发编程、算法等方面。以下是详细的面试问题及回答整理。面试问题及回答1. Java 的集合类知道哪些?Java 的集合类主要分为以下几类:List:有序集合,允许重复元素。常见实现类有 ArrayList、LinkedList、Vector。Set:不允许重复元素的集合。常见实现类有 HashSet、LinkedHashSet、TreeSet。Map:键值对集合,键唯一但值可以重复。常见实现类有 HashMap、LinkedHashMap、TreeMap、Hashtable、ConcurrentHashMap。Queue:队列集合,支持 FIFO(先进先出)操作。常见实现类有 LinkedList、PriorityQueue、ArrayDeque。2. 说说 HashMap?HashMap 是 Java 中常用的集合类,基于哈希表实现,允许存储键值对。其主要特点如下:无序存储:HashMap 不保证元素的顺序。允许空键和空值:但最多只能有一个空键。线程不安全:在多线程环境下使用 HashMap 可能会导致数据不一致。时间复杂度:插入、删除、查找操作的时间复杂度均为 O(1)(理想情况下)。3. HashMap 线程安全吗,如何变线程安全?HashMap 本身是线程不安全的。可以通过以下几种方式使其线程安全:使用 Collections.synchronizedMap:将 HashMap 包装成线程安全的 Map。Map<String, String> map = Collections.synchronizedMap(new HashMap<>());使用 ConcurrentHashMap:ConcurrentHashMap 是线程安全的 Map 实现,性能优于 Hashtable。Map<String, String> map = new ConcurrentHashMap<>();手动同步:在访问 HashMap 的地方手动加锁。synchronized (map) { map.put(key, value); }4. ConcurrentHashMap 如何实现的?ConcurrentHashMap 通过分段锁(Segment)机制实现线程安全。具体实现如下:分段锁:将整个哈希表分成多个段(Segment),每个段内部是一个小的哈希表。锁粒度:每次操作只锁定当前段,而不是整个哈希表,提高了并发性能。JDK 1.8 改进:取消了 Segment,改为使用 CAS 操作和锁竞争机制,进一步提高了性能。5. synchronized 原理以及升级过程synchronized 是 Java 中的内置锁,用于实现线程同步。其原理如下:锁的状态:锁有四种状态,依次是无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。锁升级:锁可以从较低状态升级到较高状态,但不能降级。无锁状态:没有任何线程持有锁。偏向锁:偏向于第一个获取锁的线程,减少锁的竞争。轻量级锁:使用 CAS 操作尝试获取锁,如果失败则升级为重量级锁。重量级锁:使用操作系统互斥量实现,性能较差。6. 线程池的参数?ThreadPoolExecutor 是 Java 中创建线程池的类,其构造方法参数如下:corePoolSize:核心线程数。maximumPoolSize:最大线程数。keepAliveTime:线程空闲时间。unit:keepAliveTime 的时间单位。workQueue:任务队列,用于存储等待执行的任务。threadFactory:线程工厂,用于创建线程。handler:拒绝策略,当任务队列满且线程数达到最大值时的处理策略。7. full gc, minor gc?Minor GC:回收年轻代(Young Generation)的垃圾收集操作。当年轻代空间不足时触发。Full GC:回收整个堆(包括年轻代和老年代)的垃圾收集操作。通常在以下情况下触发:老年代空间不足。系统显式调用 System.gc()。Minor GC 时发现老年代空间不足。8. 垃圾回收算法?常见的垃圾回收算法有:标记-清除:标记所有需要回收的对象,然后清除这些对象。标记-整理:标记所有需要回收的对象,然后将存活对象移动到一端,清除边界外的对象。复制:将内存分为两个区域,每次只使用其中一个区域,将存活对象复制到另一个区域。分代收集:将内存分为年轻代和老年代,分别使用不同的回收算法。9. CPU 密集型和 IO 密集型下如何设置核心线程数?CPU 密集型:任务主要消耗 CPU 资源,核心线程数一般设置为 CPU 核心数 + 1。int corePoolSize = Runtime.getRuntime().availableProcessors() + 1;IO 密集型:任务主要消耗 I/O 资源,核心线程数一般设置为 CPU 核心数 * 2。int corePoolSize = Runtime.getRuntime().availableProcessors() * 2;10. 聚簇索引和非聚簇索引区别聚簇索引:数据行的物理存储顺序与索引顺序一致。一个表只能有一个聚簇索引。查询速度快,但插入、删除、更新操作较慢。非聚簇索引:数据行的物理存储顺序与索引顺序无关。一个表可以有多个非聚簇索引。查询速度相对较慢,但插入、删除、更新操作较快。11. MySQL 的各个隔离级别,以及分别解决了什么问题MySQL 的事务隔离级别有四种:读未提交(Read Uncommitted):最低隔离级别,允许脏读。读已提交(Read Committed):允许不可重复读,但不允许脏读。可重复读(Repeatable Read):默认隔离级别,允许幻读,但不允许脏读和不可重复读。串行化(Serializable):最高隔离级别,不允许脏读、不可重复读和幻读。12. Redis 有什么数据类型Redis 支持多种数据类型:字符串(String):最基本的类型,可以存储字符串、数字等。列表(List):有序集合,支持从两端插入和删除操作。集合(Set):无序集合,不允许重复元素。有序集合(Sorted Set):有序集合,每个元素关联一个分数。哈希表(Hash):键值对集合,键唯一。位图(Bitmap):用于处理位级别的操作。HyperLogLog:用于估算集合的基数。13. Redis 分布式锁实现?Redis 分布式锁可以通过以下几种方式实现:SETNX 命令:使用 SETNX 命令尝试获取锁。SETNX key valueEXPIRE 命令:设置锁的超时时间,防止死锁。EXPIRE key secondsLua 脚本:使用 Lua 脚本保证原子性。local key = KEYS[1] local value = ARGV[1] local expire = tonumber(ARGV[2]) if redis.call("setnx", key, value) == 1 then redis.call("expire", key, expire) return 1 else return 0 end14. 项目中的前缀树,自定义注解限频,网站优化过程前缀树(Trie):用于快速查找字符串,常用于搜索引擎、拼写检查等。自定义注解限频:通过自定义注解和 AOP 切面实现接口限流。@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface RateLimit { int limit() default 100; int time() default 1; } @Aspect @Component public class RateLimitAspect { @Around("@annotation(rateLimit)") public Object around(ProceedingJoinPoint joinPoint, RateLimit rateLimit) throws Throwable { // 限流逻辑 return joinPoint.proceed(); } }网站优化过程:前端优化:使用 CDN、压缩资源、合并文件、懒加载等。后端优化:优化数据库查询、使用缓存、减少网络请求等。服务器优化:调整 JVM 参数、优化网络配置、使用负载均衡等。15. 算法:反转链表反转链表的实现如下:public ListNode reverseList(ListNode head) { ListNode prev = null; ListNode current = head; while (current != null) { ListNode next = current.next; current.next = prev; prev = current; current = next; } return prev; }总结本次面试涉及的知识点较为广泛,涵盖了 Java 基础、并发编程、数据库、算法等多个方面。准备面试时,建议重点复习这些知识点,并结合实际项目经验进行准备。希望这篇博客对大家有所帮助!
2024年11月11日
10 阅读
0 评论
0 点赞
2023-10-31
【MacOS】安装JDK并配置环境变量
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home PATH=$JAVA_HOME/bin:$PATH //给环境变量赋值 export JAVA_HOME //导出使其生效 export PATH 参考链接:https://blog.csdn.net/m0_51520179/article/details/131295356
2023年10月31日
24 阅读
0 评论
0 点赞
2022-12-16
java生成签名过程
set PATH=%PATH%;"D:\Program Files\Java\jre1.8.0_25\bin" keytool -genkey -alias testapp -keyalg RSA -keysize 2048 -validity 36500 -keystore testapp.keystore Enter keystore password: //testapp1992 Re-enter new password: //testapp1992 What is your first and last name? [Unknown]: //testapp What is the name of your organizational unit? [Unknown]: //starg What is the name of your organization? [Unknown]: //starg What is the name of your City or Locality? [Unknown]: //xiamen What is the name of your State or Province? [Unknown]: //xiamen What is the two-letter country code for this unit? [Unknown]: //CN Is CN=XX, OU=XX, O=XX, L=XX, ST=XX, C=XX correct? [no]: //确认上面输入的内容是否正确,输入y,回车 Enter key password for <testalias> (RETURN if same as keystore password): //确认证书密码与证书文件密码一样(HBuilder|HBuilderX要求这两个密码一致),直接回车就可以 keytool -list -v -keystore testapp.keystore 别名: testapp 创建日期: 2021-8-4 条目类型: PrivateKeyEntry 证书链长度: 1 证书[1]: 所有者: CN=testapp, OU=starg, O=starg, L=xiamen, ST=xiamen, C=CN 发布者: CN=testapp, OU=starg, O=starg, L=xiamen, ST=xiamen, C=CN 序列号: 18728bc0 有效期开始日期: Wed Aug 04 10:30:32 CST 2021, 截止日期: Fri Jul 11 10:30:32 CST 2121 证书指纹: MD5: B4:14:19:EA:7A:D4:8F:E4:AB:D7:E9:04:11:C7:EB:7D SHA1: 46:6E:CA:FA:58:45:05:29:5E:FF:00:D0:53:A0:D6:45:B4:63:B4:CB SHA256: 91:8C:A9:14:E2:77:27:C6:36:EE:AC:DD:D6:08:22:2F:95:77:9A:63:E2:CE:34:A1:38:6C:F5:CF:13:31:9B:22 签名算法名称: SHA256withRSA 版本: 3 扩展: #1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: FF ED 61 5C 25 46 D5 40 30 1C 5D FA B8 D9 8C 8A ..a\%F.@0.]..... 0010: AD 72 4D 0D .rM. ] ] ******************************************* *******************************************
2022年12月16日
95 阅读
0 评论
0 点赞
2022-12-13
docker搭建maven私有仓库
(一)引言在实际开发工作中,通常需要搭建maven私有仓库。(二)Nexus介绍 Nexus 是Maven仓库管理器,如果你使用Maven,你可以从Maven中央仓库 下载所需要的构件(artifact),但这通常不是一个好的做法,你应该在本地架设一个Maven仓库服务器,在代理远程仓库的同时维护本地仓库,以节省带宽和时间,Nexus就可以满足这样的需要。此外,他还提供了强大的仓库管理功能,构件搜索功能,它基于REST,友好的UI是一个extjs的REST客户端,它占用较少的内存,基于简单文件系统而非数据库。这些优点使其日趋成为最流行的Maven仓库管理器。(三)安装docker请参考 Docker安装_Icoolkj的博客(四)docker中安装nexus31、拉取镜像## 通过docker search nexus 命令搜索一下docker公有库在的 nexus相关的镜像 [root@icoolkj ~]# docker search nexus## 拉取nexus3镜像 [root@icoolkj /]# docker pull sonatype/nexus3 Using default tag: latest latest: Pulling from sonatype/nexus3 f70d60810c69: Pull complete 545277d80005: Pull complete 10b49635409a: Pull complete Digest: sha256:3fd7e90bcf49fb55d87d852cab854e5669ed115b09bdb25f47c45ee0797231aa 147.6MB/295.3MB Status: Downloaded newer image for sonatype/nexus3:latest docker.io/sonatype/nexus3:latest [root@icoolkj /]# 2、建立数据储存文件夹## 建立数据存放文件夹,用于docker中nexus的数据与本地物理机映射 [root@icoolkj /]# mkdir -p /usr/local/nexus3/nexus-data [root@icoolkj /]# ll /usr/local/nexus3/ 总用量 4 drwxr-xr-x 2 root root 4096 6月 3 18:06 nexus-data ## 更改权限 [root@icoolkj /]# chmod 777 /usr/local/nexus3/nexus-data/ [root@icoolkj /]# ll /usr/local/nexus3/ 总用量 4 drwxr-xr-x 2 777 root 4096 6月 3 18:06 nexus-data [root@icoolkj /]# 3、安装并运行容器## 编写启动脚本docker-nexus3-start.sh docker rm -f docker-nexus3 || true docker run --name docker-nexus3 \ -p 8081:8081 \ -v /usr/local/nexus3/nexus-data:/nexus-data \ --restart=always \ -d sonatype/nexus3 ## 参数说明 --name nexus #启动该容器的名字,可以自己更改为自己想要的名字 -p 8081:8081 #端口映射,将本地8081端口映射为容器的8081端口,第一个8081可以改成自己想要放开的端口 -v /docker/nexus/nexus-data:/nexus-data # 将容器的/nexus-data地址 代理到 本地/docker/nexus/nexus-data文件夹下 --restart=always #在重启docker时,自动重启改容器。 -d sonatype/nexus3 #即为后台运行一直sonatype/nexus34、获取容器的日志[root@icoolkj nexus3]# docker logs -f --tail 20 docker-nexus3(五)使用nexus31、浏览器访问2、配置Nexus提示输入密码,并告知你的密码储存位置Your admin user password is located in /nexus-data/admin.password on the server.因为docker中nexus3的数据储存位置与本地物理机建立了映射关系,所有在物理机上的地址应该是/usr/local/nexus3/nexus-data/admin.password登录成功后需要更改密码,更改密码需要记住(浏览器都有记住密码的功能,顺⼿点保存⾯,下次你直接登录就好了);更改密码完成之后,admin.password⽂件⾃动删除!!!## 默认仓库说明 maven-central:maven中央库,默认从https://repo1.maven.org/maven2/拉取jar maven-releases:私库发行版jar,初次安装请将Deployment policy设置为Allow redeploy maven-snapshots:私库快照(调试版本)jar maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地maven基础配置settings.xml或项目pom.xml中使用## Nexus仓库类型介绍 hosted:本地仓库,通常我们会部署自己的构件到这一类型的仓库。比如公司的第二方库。 proxy:代理仓库,它们被用来代理远程的公共仓库,如maven中央仓库。 group:仓库组,用来合并多个hosted/proxy仓库,当你的项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可。如图所示,代理仓库负责代理远程中央仓库,托管仓库负责本地资源,组资源库 = 代理资源库 + 托管资源库3、配置阿里云代理仓库1)、新建仓库(Create repository)Repository-->Repositories-->Create repository-->maven2(proxy)填写仓库名称——maven-aliyun,并填入仓库urlhttps://maven.aliyun.com/repository/public2)、配置仓库组(默认已有一个maven-public) 注:注意仓库顺序。maven查找依赖时会依次遍历仓库组中的仓库。## 官方文档中建议: It is recommended practice to place hosted repositories higher in the list than proxy repositories. For proxy repositories, the repository manager needs to check the remote repository which will incur more overhead than a hosted repository lookup. 希望将hosted repositories【托管资源库】的顺序放在proxy repositories【代理资源库】之前,因为一个group【组资源库】中可以涵括这些托管资源库和代理资源库。而一整个的group是作为一个public,一个接口给别人使用的。所以当查找架包的时候,如果代理资源库在前面,那就是先从远程去查找jar,而不是先从托管资源库(本地仓库)去查找是否有jar。这样访问外网的消耗比起来在本地查找,当然是将托管资源库放在代理资源库之前的优先位置了。4、创建角色创建角色(develop),并分配nx-all权限Security-->Roles-->Create注:创建角色的同时可以为当前创建的角色分配权限。5、创建用户创建用户(developer),并授予develop角色Security-->Users-->Create注:创建用户并为创建的用户挂上相应的角色。(六)maven配置文件Maven下的setting.xml文件和项目中的pom.xml文件的关系是:settting.xml文件是全局设置,而pom.xml文件是局部设置。pom.xml文件对于项目来说,是优先使用的。而pom.xml文件中如果没有配置镜像地址的话,就按照settting.xml中定义的地址去查找。修改本地maven配置文件(conf/setting.xml)servers节点下添加以下内容(username和password为刚刚在nexus3中添加的用户和其密码) <!--nexus服务器,id为组仓库name--> <servers> <server> <id>maven-public</id> <username>developer</username> <password>icoolkj</password> </server> <server> <id>maven-releases</id> <!--对应pom.xml的id=releases的仓库--> <username>developer</username> <password>icoolkj</password> </server> <server> <id>maven-snapshots</id> <!--对应pom.xml中id=snapshots的仓库--> <username>developer</username> <password>icoolkj</password> </server> </servers>mirrors节点下添加以下内容 <!--仓库组的url地址,id和name可以写组仓库name,mirrorOf的值设置为central--> <mirrors> <mirror> <id>maven-public</id> <name>maven-public</name> <!--镜像采用配置好的组的地址--> <url>http://182.92.199.85:8081/repository/maven-public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors>(七)项目中发布pom.xml配置实际使用中distributionManagement可以配置在parent项目中,子项目无需重复配置。上述配置全部完成后就可以在项目中使用mven clean deploy将项目的jar包上传到自己的私服上了。 <repositories> <repository> <id>maven-public</id> <name>Nexus Repository</name> <url>http://192.168.1.188:8081/repository/maven-public/</url> <snapshots> <enabled>true</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>maven-public</id> <name>Nexus Plugin Repository</name> <url>http://192.168.1.188:8081/repository/maven-public/</url> <snapshots> <enabled>true</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </pluginRepository> </pluginRepositories> <!--项目分发信息,在执行mvn deploy后表示要发布的位置。有了这些信息就可以把网站部署到远程服务器或者把构件jar等部署到远程仓库。 --> <distributionManagement> <repository><!--部署项目产生的构件到远程仓库需要的信息 --> <id>maven-releases</id><!-- 此处id和settings.xml的id保持一致 --> <name>Nexus Release Repository</name> <url>http://192.168.1.188:8081/repository/maven-releases/</url> </repository> <snapshotRepository><!--构件的快照部署到哪里?如果没有配置该元素,默认部署到repository元素配置的仓库,参见distributionManagement/repository元素 --> <id>maven-snapshots</id><!-- 此处id和settings.xml的id保持一致 --> <name>Nexus Snapshot Repository</name> <url>http://192.168.1.188:8081/repository/maven-snapshots/</url> </snapshotRepository> </distributionManagement>至此,nexus搭建完毕,支持本地部署依赖jar包。
2022年12月13日
162 阅读
0 评论
0 点赞
2022-12-12
java实现WebSocket服务端
WebSocket服务端配置类import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Service; import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.server.standard.ServerEndpointExporter; /** * websocket配置类 * @author daiyg * @date 2021/8/24 17:19 */ @Service @Configuration @EnableWebSocket public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter(){ return new ServerEndpointExporter(); } }服务端代码import com.caso.common.core.utils.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.stereotype.Component; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; /** * @author daiyg * @date 2021/8/24 18:15 */ @Component @ServerEndpoint(value = "/websocket/{id}/{key}", subprotocols = {"protocol"}) public class WebSocketServer { private static int onlineCount = 0; private static ConcurrentHashMap<String, WebSocketServer> webSocketSet = new ConcurrentHashMap<>(); private static ConcurrentHashMap<String, List<String>> map = new ConcurrentHashMap<>(); //与某个客户端的连接会话,需要通过它来给客户端发送数据 private Session session; private static Logger log = LogManager.getLogger(WebSocketServer.class); private String id = ""; private String key= ""; /** * 连接建立成功调用的方法 */ @OnOpen public void onOpen(@PathParam(value = "id") String id,@PathParam("key") String key, Session session) { this.session = session; this.id = id;//接收到发送消息的人员编号 this.key = key; if ("1".equals(id)) { log.info("非门岗用户连接!"); } else { List<String> ids = new ArrayList<>(); ids = map.get(id); if(StringUtils.isEmpty(ids)){ ids = new ArrayList<>(); } ids.add(key); map.put(id,ids); webSocketSet.put(key, this); //加入set中 } addOnlineCount(); //在线数加1 log.info("用户" + id + "连接成功!当前在线人数为" + getOnlineCount()); try { sendMessage("连接成功"); } catch (IOException e) { log.error("websocket IO异常"); } } /** * 连接关闭调用的方法 */ @OnClose public void onClose() { //删除map中值 List<String> keys = map.get(this.id); for (int i = 0; i < keys.size(); i++) { if(this.key.equals(keys.get(i))){ keys.remove(i); i--; } } webSocketSet.remove(this.key); //从set中删除 subOnlineCount(); //在线数减1 log.info("有一连接关闭!当前在线人数为" + getOnlineCount()); } /** * 收到客户端消息后调用的方法 * * @param message 客户端发送过来的消息 */ @OnMessage public void onMessage(String message) { log.info("来自客户端的消息:" + message); } /** * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { log.error("发生错误"); try { session.close(); } catch (IOException e) { e.printStackTrace(); } error.printStackTrace(); } /** * 服务端主动推送消息 * * @param message * @throws IOException */ public void sendMessage(String message) throws IOException { this.session.getBasicRemote().sendText(message); } /** * 发送信息给指定ID用户,如果用户不在线则返回不在线信息给自己 * * @param message * @param personKeys * @throws IOException */ public static void sendtoUser(String message, String[] personKeys) throws IOException { //获取人员集合 for (String personKey : personKeys) { //获取map中对应的链接 if (map.get(personKey) != null && StringUtils.isNotEmpty(map.get(personKey))) { //遍历给连接人发送信息 for(String s : map.get(personKey)){ webSocketSet.get(s).sendMessage(message); } } else { //如果用户不在线则返回不在线信息给自己 log.error("当前用户不在线:" + personKey); } } } /** * 发送信息给所有人 * * @param * @throws IOException */ public void sendtoAll(String message) throws IOException { for (String key : webSocketSet.keySet()) { try { webSocketSet.get(key).sendMessage(message); } catch (IOException e) { e.printStackTrace(); } } } public static synchronized int getOnlineCount() { return onlineCount; } public static synchronized void addOnlineCount() { WebSocketServer.onlineCount++; } public static synchronized void subOnlineCount() { WebSocketServer.onlineCount--; } }
2022年12月12日
66 阅读
0 评论
0 点赞
1
2
...
5
您的IP: