FreeIM/ImClient.cs
(开头部分) 9KB这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。
using FreeRedis;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
/// <summary>
/// im 核心类实现
/// </summary>
public class ImClient
{
protected RedisClient _redis;
protected string[] _servers;
protected string _redisPrefix;
protected string _pathMatch;
/// <summary>
/// 推送消息的事件,可审查推向哪个Server节点
/// </summary>
public EventHandler<ImSendEventArgs> OnSend;
/// <summary>
/// 初始化 imclient
/// </summary>
/// <param name="options"></param>
public ImClient(ImClientOptions options)
{
if (options.Redis == null) throw new ArgumentException("ImClientOptions.Redis 参数不能为空");
if (options.Servers.Any() == false) throw new ArgumentException("ImClientOptions.Servers 参数不能为空");
_redis = options.Redis;
_servers = options.Servers;
_redisPrefix = $"wsim{options.PathMatch.Replace('/', '_')}";
_pathMatch = options.PathMatch ?? "/ws";
}
/// <summary>
/// 负载分区规则:取clientId后四位字符,转成10进制数字0-65535,求模
/// </summary>
/// <param name="clientId">客户端id</param>
/// <returns></returns>
protected string SelectServer(Guid clientId)
{
var servers_idx = int.Parse(clientId.ToString("N").Substring(28), NumberStyles.HexNumber) % _servers.Length;
if (servers_idx >= _servers.Length) servers_idx = 0;
return _servers[servers_idx];
}
/// <summary>
/// ImServer 连接前的负载、授权,返回 ws 目标地址,使用该地址连接 websocket 服务端
/// </summary>
/// <param name="clientId">客户端id</param>
/// <param name="clientMetaData">客户端相关信息,比如ip</param>
/// <returns>websocket 地址:ws://xxxx/ws?token=xxx</returns>
public string PrevConnectServer(Guid clientId, string clientMetaData)
{
var server = SelectServer(clientId);
var token = $"{Guid.NewGuid()}{Guid.NewGuid()}{Guid.NewGuid()}{Guid.NewGuid()}".Replace("-", "");
_redis.Set($"{_redisPrefix}Token{token}", JsonConvert.SerializeObject((clientId, clientMetaData)), 10);
return $"ws://{server}{_pathMatch}?token={token}";
后面还有 187 行代码,解锁后查看完整代码
24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明
AI 解读
登录后可用,每次 10 积分,解读结果公开显示在下面。
还没有人解读过这个文件。
