common java socket_Java Socket实战之一 单线程通信基础socket

package com.sm.common.socket;

import java.util.ArrayList;

import java.util.Collection;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.Set;

import org.java_websocket.WebSocket;public classWsPool {private static final Map wsUserMap = new HashMap();/**

* 通过websocket连接获取其对应的用户*/

public staticString getUserByWs(WebSocket conn) {return wsUserMap.get(conn);

}/**

* 根据userName获取WebSocket,这是一个list,此处取第一个

* 因为有可能多个websocket对应一个userName(但一般是只有一个,因为在close方法中,我们将失效的websocket连接去除了)*/

public staticWebSocket getWsByUser(String userName) {

Set keySet =wsUserMap.keySet();

synchronized (keySet) {for(WebSocket conn : keySet) {

String cuser= wsUserMap.get(conn);if(cuser.equals(userName)) {returnconn;

}

}

}return null;

}/**

* 向连接池中添加连接*/

public static voidaddUser(String userName, WebSocket conn) {

wsUserMap.put(conn, userName);//添加连接

}/**

* 获取所有连接池中的用户,因为set是不允许重复的,所以可以得到无重复的user数组*/

public static CollectiongetOnlineUser() {

List setUsers = new ArrayList();

Collection setUser =wsUserMap.values();for(String u : setUser) {

setUsers.add(u);

}returnsetUsers;

}/**

* 移除连接池中的连接*/

public staticboolean removeUser(WebSocket conn) {if(wsUserMap.containsKey(conn)) {

wsUserMap.remove(conn);//移除连接

return true;

}else{return false;

}

}/**

* 向特定的用户发送数据*/

public static voidsendMessageToUser(WebSocket conn, String message) {if (null != conn && null != wsUserMap.get(conn)) {

conn.send(message);

}

}/**

* 向所有用户名中包含某个特征得用户发送消息*/

public static voidsendMessageToSpecialUser(String message, String special) {

Set keySet =wsUserMap.keySet();if (special == null) {

special= "";

}

synchronized (keySet) {for(WebSocket conn : keySet) {

String user= wsUserMap.get(conn);try{if (user != null) {

String[] cus= user.split("_");if (cus[0] != null && !"".equals(cus[0])) {

String cusDot= "," + cus[0] + ",";if (cusDot.contains("," + special + ",")) {

conn.send(message);

}

}else{

conn.send(message);

}

}

}catch(Exception e) {

e.printStackTrace();//wsUserMap.remove(conn);

}

}

}

}/**

* 向所有的用户发送消息*/

public static voidsendMessageToAll(String message) {

Set keySet =wsUserMap.keySet();

synchronized (keySet) {for(WebSocket conn : keySet) {

String user= wsUserMap.get(conn);if (user != null) {

conn.send(message);

}

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:基于心跳的socket长连接博客中提到了一种实现socket长连接和心跳检测的方法。在这种方法中,客户端和服务器之间通过发送心跳包来保持连接的活跃状态。心跳包是一个空消息,通过定时发送心跳包,客户端和服务器可以相互确认对方的存在,从而保持连接的稳定性。 引用\[2\]:TCP的socket本身就是长连接的,但为什么还要使用心跳包呢?在smack中,有一个每30秒发送一个空消息的线程,这是为了保持连接的活跃状态。心跳包的作用是检测连接是否正常,如果连接断开,就可以及时重新建立连接。心跳包还可以用于检测网络延迟和丢包率等问题,从而提高连接的可靠性。 引用\[3\]:在Java中实现socket长连接和心跳检测可以通过以下步骤: 1. 创建一个Socket对象,并连接到服务器。 2. 创建一个线程,用于发送心跳包。可以使用定时器或者线程池来实现定时发送心跳包的功能。 3. 在发送心跳包之前,需要先判断连接是否正常。可以通过发送一个特定的消息,然后等待服务器的响应来确认连接状态。 4. 如果连接断开,需要重新建立连接。可以在发送心跳包时检测连接状态,如果连接断开,则重新创建Socket对象并连接到服务器。 5. 在接收消息时,需要处理异常情况,比如连接断开或者超时等。 通过以上步骤,可以实现Java中的socket长连接和心跳检测,并确保线程安全。 #### 引用[.reference_title] - *1* *2* *3* [Java socket长连接代码实现](https://blog.csdn.net/weixin_42370320/article/details/114414531)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值