基於netty的聊天室
基於netty的聊天室
更多幹貨
部分程式碼
netty4 部分程式碼
package com.cn.common.core.session;
/**
* 會話抽象介面
*
*
*/
public interface Session {
/**
* 會話繫結物件
* @return
*/
Object getAttachment();
/**
* 繫結物件
* @return
*/
void setAttachment(Object attachment);
/**
* 移除繫結物件
* @return
*/
void removeAttachment();
/**
* 向會話中寫入訊息
* @param message
*/
void write(Object message);
/**
* 判斷會話是否在連線中
* @return
*/
boolean isConnected();
/**
* 關閉
* @return
*/
void close();
}
SessionImpl
package com.cn.common.core.session;
import io.netty.channel.Channel;
import io.netty.util.AttributeKey;
/**
* 會話封裝類
*
*
*/
public class SessionImpl implements Session {
/**
* 繫結物件key
*/
public static AttributeKey<Object> ATTACHMENT_KEY = AttributeKey.valueOf("ATTACHMENT_KEY");
/**
* 實際會話物件
*/
private Channel channel;
public SessionImpl(Channel channel) {
this.channel = channel;
}
@Override
public Object getAttachment() {
return channel.attr(ATTACHMENT_KEY).get();
}
@Override
public void setAttachment(Object attachment) {
channel.attr(ATTACHMENT_KEY).set(attachment);
}
@Override
public void removeAttachment() {
channel.attr(ATTACHMENT_KEY).remove();
}
@Override
public void write(Object message) {
channel.writeAndFlush(message);
}
@Override
public boolean isConnected() {
return channel.isActive();
}
@Override
public void close() {
channel.close();
}
}
SessionManager
package com.cn.common.core.session;
import java.util.Collections;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import com.cn.common.core.model.Response;
import com.cn.common.core.serial.Serializer;
import com.cn.common.core.session.Session;
import com.google.protobuf.GeneratedMessage;
/**
* 會話管理者
*
*
*/
public class SessionManager {
/**
* 線上會話
*/
private static final ConcurrentHashMap<Long, Session> onlineSessions = new ConcurrentHashMap<>();
/**
* 加入
* @param playerId
* @param channel
* @return
*/
public static boolean putSession(long playerId, Session session){
if(!onlineSessions.containsKey(playerId)){
boolean success = onlineSessions.putIfAbsent(playerId, session)== null? true : false;
return success;
}
return false;
}
/**
* 移除
* @param playerId
*/
public static Session removeSession(long playerId){
return onlineSessions.remove(playerId);
}
/**
* 傳送訊息[自定義協議]
* @param <T>
* @param playerId
* @param message
*/
public static <T extends Serializer> void sendMessage(long playerId, short module, short cmd, T message){
Session session = onlineSessions.get(playerId);
if (session != null && session.isConnected()) {
Response response = new Response(module, cmd, message.getBytes());
session.write(response);
}
}
/**
* 傳送訊息[protoBuf協議]
* @param <T>
* @param playerId
* @param message
*/
public static <T extends GeneratedMessage> void sendMessage(long playerId, short module, short cmd, T message){
Session session = onlineSessions.get(playerId);
if (session != null && session.isConnected()) {
Response response = new Response(module, cmd, message.toByteArray());
session.write(response);
}
}
/**
* 是否線上
* @param playerId
* @return
*/
public static boolean isOnlinePlayer(long playerId){
return onlineSessions.containsKey(playerId);
}
/**
* 獲取所有線上玩家
* @return
*/
public static Set<Long> getOnlinePlayers() {
return Collections.unmodifiableSet(onlineSessions.keySet());
}
}
相關文章
- 基於golang的聊天室Golang
- 基於webapi的websocket聊天室(四)WebAPI
- Netty版本 簡單聊天室Netty
- netty系列之:文字聊天室Netty
- 基於Netty實現的WebSocket聊天室--支援多人同時線上及定時心跳檢測NettyWeb
- Netty 框架學習 —— 基於 Netty 的 HTTP/HTTPS 應用程式Netty框架HTTP
- 基於webapi的websocket聊天室(番外二)WebAPI
- 基於webapi的websocket聊天室(番外一)WebAPI
- C++ 實現基於TCP的聊天室C++TCP
- 基於 golang + vue + websocket 開發的聊天室GolangVueWeb
- 基於netty手寫RPC框架NettyRPC框架
- 基於 flask 結合 Redis 的簡單聊天室FlaskRedis
- 聊天室應用開發實踐(二):實現基於 Web 的聊天室Web
- 基於websocket與nodejs-websocket的簡單聊天室WebNodeJS
- Netty網路聊天(一) 聊天室的實戰(最易懂)Netty
- netty系列之:基於流的資料傳輸Netty
- Netty高階應用及聊天室實戰Netty
- 基於SpringBoot+STOMP協議實現的web聊天室Spring Boot協議Web
- Python基於Socket實現簡易多人聊天室Python
- 從零單排,使用 Netty 構建 IM 聊天室~Netty
- Android 長連線初體驗(基於netty)AndroidNetty
- 基於Netty自己動手實現Web框架NettyWeb框架
- Android 基於Netty的訊息推送方案之Hello World(一)AndroidNetty
- 基於Netty的Android系統IM簡單實現原理NettyAndroid
- Java進階:基於TCP通訊的網路實時聊天室JavaTCP
- 造個輪子之基於 Netty 實現自己的 RPC 框架NettyRPC框架
- 基於Netty實現Redis協議的編碼解碼器NettyRedis協議
- Android 基於Netty的訊息推送方案之概念和工作原理(二)AndroidNetty
- 基於Netty實現海量接入的推送服務技術要點Netty
- 基於Java NIO 寫的一個簡單版 Netty 服務端JavaNetty服務端
- 基於大量圖片與例項深度解析Netty中的核心元件Netty元件
- 手把手教你基於Netty實現一個基礎的RPC框架(通俗易懂)NettyRPC框架
- Android 基於Netty的訊息推送方案之字串的接收和傳送(三)AndroidNetty字串
- 基於SpringBoot+Netty實現一個自己的推送服務系統Spring BootNetty
- 基於Netty,徒手擼IM(一):IM系統設計篇Netty
- 基於 Flutter+Dart 聊天例項 | Flutter 仿微信介面聊天室FlutterDart
- 開源一個自用的Android IM庫,基於Netty+TCP+Protobuf實現。AndroidNettyTCP
- JAVA SE 實戰篇 C6 基於CSFramework的聊天室 (上) 伺服器APPJavaFramework伺服器APP