从当前项目中聊开一下

国庆期间,研究了 indexed mode 下的 PNG transparency 的内部格式(最近的项目需要生成特定格式的PNG文件),了解了 tRNS 与 Alpha 通道的不同,也写下了如下的 探索性代码。

生成的 Indexed mode PNG 有 GIMP 中可以看到 颜色表

同时过程中 IDAT Chunk 需要用到 zlib 压缩就看了一下 zlib 的代码,只是看的过程中也想起之前工作中的一些场景。

场景一:年初,评审开发人员的方案时,我提出 “表驱动” 的方案,结果 所有人都一脸蒙(显然是没有 翻过 《代码大全》的 Code Monkey)

我们来看一下 zlib 实现压缩时用到的 “表驱动” 方案(函数表)

我们平常所知道的 压缩级别 0-9 不就对应了 函数表中 0~9 的索引了 么?

 

场景二:

常常我都会和开发聊到 状态机,但绝大多数人 都是没有说到 “点”,这些人中要么 没有写过 demo,要么只是看了一些别人的博客,也有一些人 还不知道这个概念

我从这次看 zlib 的代码中 拿一个例子,解压时(或者通用来说 decode 各种 按某种协议encoded 的data 时)就是一个 从 read data stream 上 read 的到数据去决断当前的 最新状态 再执行对应的 decode 操作

 

PS: 高效的方法是,这样的研究场景(参考已经有的 XX 实现),不需要去 github 下载代码,对应的的 ubuntu 中 打开 deb-src 可以下载对应 软件包 的源代码,也可以下载到 调试符号 dbgsym。去了解你的工具,而不是只有代码还是代码。

天室项目时,实现单功能的核心在于如何标识天对象并正确地将消息发送给指定的接收者。通常,单功能的实现依赖于客户端和服务器端之间的消息传递机制。在客户端,用户可以选择特定的天对象,而服务器端则需要根据天对象的标识符将消息转发给目标用户。 ### 单功能的实现方法 在客户端,天对象的选择通常通过一个列表控件来实现。当用户点击列表中的某个项时,变量 `m_cur_chat` 会更新为当前选中的天对象的索引值。这个变量决定了消息是群发还是私发。例如,当用户按下 Enter 键发送消息时,程序会根据 `m_cur_chat` 的值判断是群发还是单。如果 `m_cur_chat` 的值为 `-1`,则表示群发;如果是一个具体的索引值,则表示单[^2]。 ```cpp void sendMessage() { if (m_cur_chat == -1) { // 群发消息 sendGroupMessage(); } else { // 单消息 sendPrivateMessage(m_cur_chat); } } ``` 在服务器端,单功能的实现主要依赖于维护一个用户列表,其中每个用户都有一个唯一的标识符(如昵称或用户ID)和对应的网络连接套接字。当服务器接收到一条单消息时,它会解析消息中的目标用户标识符,并遍历用户列表,找到对应的网络连接套接字,然后通过该套接字将消息发送给目标用户。例如,在 C++ 中,可以通过 `std::map` 来存储用户信息,其中键是用户的昵称,值是用户的网络连接套接字。 ```cpp std::map<std::string, SOCKET> g_user; void SingleChat(SOCKET sock, std::vector<char>& msg) { std::string s(msg.begin(), msg.end()); int index = s.find('['); std::string h(s.data(), s.data() + index); // 获取要单的昵称 for (auto& [sock, name] : g_user) { if (name == h) { NetPacket::SendMsg(sock, msg_id::single, msg); break; } } } ``` 在 Qt 框架中,可以通过 `QMap` 来存储用户信息,其中键是用户的昵称,值是用户的网络连接套接字。当客户端连接到服务器时,客户端会发送自己的昵称给服务器,服务器将其存储在用户列表中。当需要发送单消息时,服务器会根据消息中的目标用户昵称查找对应的网络连接套接字,并通过该套接字发送消息。 ```cpp QMap<QString, QTcpSocket*> g_user; void handlePrivateMessage(QString targetName, QByteArray message) { QTcpSocket* targetSocket = g_user.value(targetName); if (targetSocket) { targetSocket->write(message); } } ``` 为了确保单功能的稳定性和可靠性,还需要考虑以下几个方面: - **消息格式**:确保每条消息都包含必要的元数据,如发送者、接收者、消息类型等。 - **错误处理**:当目标用户不在线时,应有相应的处理机制,如返回错误信息或缓存消息。 - **安全性**:对消息进行加密,防止消息被第三方截获。 - **性能优化**:通过异步 I/O 和线程池等技术提高服务器的并发处理能力。 通过上述方法,可以在天室项目中实现高效的单功能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值