日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java web聊天室私聊map_java websocket聊天室示例(springboot)

發布時間:2023/12/13 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java web聊天室私聊map_java websocket聊天室示例(springboot) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【實例簡介】

【實例截圖】

【核心代碼】

package com.example.demo;

import java.io.IOException;

import java.text.DateFormat;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.concurrent.ConcurrentHashMap;

import javax.websocket.OnClose;

import javax.websocket.OnMessage;

import javax.websocket.OnOpen;

import javax.websocket.Session;

import javax.websocket.server.PathParam;

import javax.websocket.server.ServerEndpoint;

import org.springframework.stereotype.Component;

import net.sf.json.JSONObject;

@ServerEndpoint(value = "/websocket/{userno}")

@Component

public class MyWebSocket {

//靜態變量,用來記錄當前在線連接數。應該把它設計成線程安全的。

private static int onlineCount = 0;

private static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

//concurrent包的線程安全Set,用來存放每個客戶端對應的MyWebSocket對象。

// private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet();

//concurrent包的線程安全Set,用來存放每個客戶端對應的MyWebSocket對象。若要實現服務端與單一客戶端通信的話,可以使用Map來存放,其中Key可以為用戶標識

private static ConcurrentHashMap webSocketSet = new ConcurrentHashMap();

//與某個客戶端的連接會話,需要通過它來給客戶端發送數據

private Session session;

//當前發消息的人員編號

private String userno = "";

/**

* 連接建立成功調用的方法*/

@OnOpen

public void onOpen(@PathParam(value = "userno") String param,Session session) {

System.out.println(param);

userno = param;//接收到發送消息的人員編號

this.session = session;

addOnlineCount();

webSocketSet.put(param, this);//加入map中

System.out.println("有新連接加入!當前在線人數為" getOnlineCount());

String nickname="{'nickname':'" param "','content':'上線'}";

JSONObject obj = JSONObject.fromObject(nickname);

try {

sendMessage(obj "");

} catch (IOException e) {

System.out.println("IO異常");

}

}

/**

* 連接關閉調用的方法

*/

@OnClose

public void onClose() {

webSocketSet.remove(this); //從set中刪除

subOnlineCount(); //在線數減1

System.out.println("有一連接關閉!當前在線人數為" getOnlineCount());

}

/**

* 收到客戶端消息后調用的方法

*

* @param message 客戶端發送過來的消息*/

@OnMessage

public void onMessage(String message, Session session) {

System.out.println("來自客戶端的消息:" message);

System.out.println("來自客戶端的消息:" message);

// session.get

sendToUser(message);

//群發消息

/* if (1 < 2) {

sendAll(message);

} else {

//給指定的人發消息

sendToUser(message);

}*/

}

/**

* 給指定的人發送消息

* @param message

*/

private void sendToUser(String message) {

// String sendUserno = message.split("[|]")[1];

// String sendMessage = message.split("[|]")[0];

JSONObject obj = JSONObject.fromObject(message);

obj.put("date", df.format(new Date()));

String now = getNowTime();

try {

Object object2 = obj.get("nickname2");

if (webSocketSet.get(obj.get("nickname")) != null) {

obj.put("isSelf", false);

Object object = obj.get("content");

webSocketSet.get(obj.get("nickname")).sendMessage(obj.toString());

}

if(webSocketSet.get(object2) != null){

obj.put("isSelf", true);

Object object = obj.get("content");

webSocketSet.get(obj.get("nickname2")).sendMessage(obj.toString());

}

} catch (IOException e) {

e.printStackTrace();

}

}

/**

* 給所有人發消息

* @param message

*/

private void sendAll(String message) {

String now = getNowTime();

String sendMessage = message.split("[|]")[0];

//遍歷HashMap

for (String key : webSocketSet.keySet()) {

try {

//判斷接收用戶是否是當前發消息的用戶

if (userno.equals(key)) {

webSocketSet.get(key).sendMessage(now "用戶" userno "發來消息:" "
" sendMessage);

System.out.println("key = " key);

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

/**

* 獲取當前時間

*

* @return

*/

private String getNowTime() {

Date date = new Date();

DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String time = format.format(date);

return time;

}

public void sendMessage(String message) throws IOException{

this.session.getBasicRemote().sendText(message);

//this.session.getAsyncRemote().sendText(message);

}

/**

* 發生錯誤時調用

@OnError

public void onError(Session session, Throwable error) {

System.out.println("發生錯誤");

error.printStackTrace();

}

public void sendMessage(String message) throws IOException {

this.session.getBasicRemote().sendText(message);

//this.session.getAsyncRemote().sendText(message);

}

/**

* 群發自定義消息

* */

public static void sendInfo(String message) throws IOException {

}

public static synchronized int getOnlineCount() {

return onlineCount;

}

public static synchronized void addOnlineCount() {

MyWebSocket.onlineCount ;

}

public static synchronized void subOnlineCount() {

MyWebSocket.onlineCount--;

}

}

總結

以上是生活随笔為你收集整理的java web聊天室私聊map_java websocket聊天室示例(springboot)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。