博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于netty的聊天室
阅读量:3728 次
发布时间:2019-05-22

本文共 3382 字,大约阅读时间需要 11 分钟。

基于netty的聊天室

更多干货

概述

  • chat_netty3 基于netty3

  • chat_netty4 基于netty4

  • chat_protobuf 序列化协议 使用protobuf

部分代码

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 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
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
* @param playerId * @param message */ public static
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
* @param playerId * @param message */ public static
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
getOnlinePlayers() { return Collections.unmodifiableSet(onlineSessions.keySet()); }}

转载地址:http://xclnn.baihongyu.com/

你可能感兴趣的文章
添加课程信息前端2
查看>>
np.random.random()系列函数
查看>>
杂注__declspec
查看>>
更改Bison-Flex的输入源
查看>>
Bison%code的使用
查看>>
Bison(yacc)如何正常退出以及返回值
查看>>
Bison 操作符前可以为空导致的归约/归约冲突
查看>>
C 强制类型转换 char转int的小陷阱
查看>>
线程安全与可重入
查看>>
一个输入密码用的隐藏输入小程序
查看>>
虚函数的默认值
查看>>
字符串处理——判断是否是数字或字母
查看>>
设计模式(C++)——工厂模式
查看>>
设计模式(C++)——抽象工厂模式
查看>>
C++ shared_ptr的实现
查看>>
自定义for循环
查看>>
C++ 毫秒转日期 以及 日期转时间的类
查看>>
重载,隐藏与虚函数
查看>>
初始化列表,以及构造函数和析构函数的调用顺序
查看>>
内联函数与宏定义函数的异同
查看>>