使用 pro1.45 在 service.Received 里面 使用 service.ResetID(idold, idnew); client.ResetID 修改ID,能够修改成功,但是没有触发 service.IDChanged 调用
TcpService service = new();
service.IDChanged = (client, e) =>
{
client.Logger.Warning($"{client.GetIPPort()}ID变更: {e.OldID},{e.NewID}");
};
service.Received = (client, byteBlock, requestInfo) => //从客户端收到信息
{
try
{
TLVDataFrame buf = (TLVDataFrame)requestInfo;
if (buf.Tag == 10)
{
var idsA = Encoding.UTF8.GetString(buf.Value, 0, buf.Length).SplitFirst('-');
if (idsA[1] != "0") //处理待连接的客户端ID
{
try
{
var idnew = idsA[1] + "-" + idsA[0]; //待连接的客户端的新ID
var idold = client.GetOtherIDs().Single((id) => id.StartsWith(idsA[1] + "-")); //老ID
if (string.IsNullOrEmpty(idold)) //没有找到待连接的客户端
{
idsA[1] = "0";
}
else if (idold != idnew) //待连接的客户端有变动
{
service.ResetID(idold, idnew);
service.Send(idnew, new ValueTLVDataFrame(10, Encoding.UTF8.GetBytes(idnew)));
var idsB = idold.SplitFirst('-');
if (idsB[1] != "0") //原先还有连接关系。抢占,需要断开原有关系
{
idold = idsB[1] + "-" + idsB[0];
idnew = idsB[1] + "-0";
service.ResetID(idold, idnew);
service.Send(idnew, new ValueTLVDataFrame(10, Encoding.UTF8.GetBytes(idnew)));
}
}
}
catch
{
idsA[1] = "0";
}
}
if (idsA[0] != "0") //处理自身的ID关系
{
var idnew = idsA[0] + "-" + idsA[1];
var idold = client.ID;
client.ResetID(idnew);
client.Send(new ValueTLVDataFrame(10, Encoding.UTF8.GetBytes(idnew)));
client.Logger.Warning($"{client.GetIPPort()}变更ID:{idnew},在线客户数{service.Count}");
var idsC = idold.SplitFirst('-');
if (idsC[1] != "0") //原先还有连接关系。需要放弃,断开原有关系
{
idold = idsC[1] + "-" + idsC[0];
idnew = idsC[1] + "-0";
service.ResetID(idold, idnew);
service.Send(idnew, new ValueTLVDataFrame(10, Encoding.UTF8.GetBytes(idnew)));
}
}
}
else //正常需要转发的数据
{
var idsD = client.ID.SplitFirst('-');
if (idsD[1] != "0")
{
var rmid = idsD[1] + "-" + idsD[0];
service.Send(rmid, buf);
client.Logger.Info($"{client.GetIPPort()} 透传 {rmid},{buf.Tag},{buf.Length}");
}
}
}
catch (Exception ex)
{
client.Logger.Error(ex.ToString());
}
};