You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

214 lines
8.4 KiB

using System;
using System.Collections.Generic;
using System.Collections.Concurrent;
namespace Sog
{
/// <summary>
/// 消息发送器,初始化的时候可决定是否支持线程安全
/// </summary>
public class PacketSender
{
private uint m_serverID;
// private uint m_accountServerID; // 暂时没发现使用的地方,修改主备后这里不建议使用
private uint m_worldServerID;
//private uint m_httpProxyServerID;
//private uint m_gameServerID;
//private uint m_battleServerID;
//private uint m_friendServerID;
private Cluster m_cluster;
public PacketSender()
{
}
/// <summary>
/// 初始化,支持线程安全可选项,默认不支持多线程
/// </summary>
/// <param name="serverID"></param>
/// <param name="cluster"></param>
/// <param name="bThreadSafe">是否线程安全,如果打开需要注意,参考m_threadSafeSendQueue的说明</param>
public void Init(uint serverID, Cluster cluster)
{
m_cluster = cluster;
m_serverID = serverID;
//m_accountServerID = ServerIDUtils.GetLevel0ServerIDByType((int)ServerType.Account, 1);
m_worldServerID = ServerIDUtils.GetLevel1ServerIDByType(m_serverID, (int)ServerType.World, 1);
//m_httpProxyServerID = ServerIDUtils.GetLevel0ServerIDByType((int)ServerType.HttpProxy, 1);
// 默认第一个gamesvr
// m_gameServerID = ServerIDUtils.GetLevel1ServerIDByType(m_serverID, (int)ServerType.Game, 1);
// m_battleServerID = ServerIDUtils.GetLevel1ServerIDByType(m_serverID, (int)ServerType.Battle, 1);
//m_friendServerID = ServerIDUtils.GetLevel1ServerIDByType(m_serverID, (int)ServerType.Friend, 1);
}
public uint GetWorldServerID()
{
return m_worldServerID;
}
public void SendToServerByID(uint dstserverID, int iMsgID, Google.Protobuf.IMessage message, long iObjectID)
{
RequestPacket reqPacket = new RequestPacket(iMsgID, iObjectID, 0);
reqPacket.Message = message;
SendToServerByID(dstserverID, reqPacket, iObjectID, 0);
}
public void SendToServerByID(uint dstserverID, int iMsgID, Google.Protobuf.IMessage message, long iObjectID, uint headserverID)
{
RequestPacket reqPacket = new RequestPacket(iMsgID, iObjectID, headserverID);
reqPacket.Message = message;
SendToServerByID(dstserverID, reqPacket, iObjectID, headserverID);
}
public void SendToServerByID(uint dstserverID, RequestPacket packet)
{
SendToServerByID(dstserverID, packet, packet.ObjectID, packet.ServerID);
}
public void SendToServerByID(uint dstserverID, RequestPacket packet, long iObjectID, uint headserverID)
{
MessageData message = PackMessagePrintf(dstserverID, packet, iObjectID, headserverID);
if(message.Buffer.Data == null)
{
return;
}
m_cluster.Send(dstserverID, message);
}
public void Broadcast(int serverType, int iMsgID, Google.Protobuf.IMessage message, long iObjectID, uint headserverID)
{
RequestPacket reqPacket = new RequestPacket(iMsgID, iObjectID, headserverID);
reqPacket.Message = message;
Broadcast(serverType, reqPacket,iObjectID, headserverID);
}
public void Broadcast(int serverType, RequestPacket packet, long iObjectID, uint headserverID)
{
uint serverID = (uint)(serverType << 8);
MessageData message = PackMessagePrintf(serverID, packet, iObjectID, headserverID);
if (message.Buffer.Data == null)
{
return;
}
m_cluster.Broadcast(serverType, message);
}
private MessageData PackMessagePrintf(uint dstserverID, RequestPacket packet, long iObjectID, uint headserverID = 0)
{
MessageData message = new MessageData();
message.Header.Type = packet.MsgID;
message.Header.ObjectID = iObjectID;
message.Header.ServerID = headserverID;
bool bRet = ProtoPackerFactory.Instance.GetProtoBufPacker().PackMessage(packet, ref message);
if (bRet == false)
{
//判断是不是sessionid,sessionid是个很大的数
if (Sog.Service.GateSessionID.IsGateSessionIDOrUserID(iObjectID))
{
TraceLog.Error("PackMessage error server {0} msgId {1} iID {2} message {3}"
, ServerIDUtils.IDToString(dstserverID), packet.MsgID, iObjectID
, packet.Message.GetType().Name);
}
else
{
TraceLog.UserError(iObjectID, "PackMessage error server {0} msgId {1} iID {2} message {3}"
, ServerIDUtils.IDToString(dstserverID), packet.MsgID, iObjectID
, packet.Message.GetType().Name);
}
return message;
}
//预先判断,提高效率
if(TraceLog.GetLogLevel() <= Log.LogLevel.TraceDetail && TraceLog.IsSkipLogMsgID(packet.MsgID) == false)
{
//判断是不是sessionid,sessionid是个很大的数
if (Sog.Service.GateSessionID.IsGateSessionIDOrUserID(iObjectID))
{
TraceLog.TraceDetail("PackMessage send to server {0} msgId {1} iID {2} message {3} -> {4}"
, ServerIDUtils.IDToString(dstserverID), packet.MsgID, iObjectID
, packet.Message.GetType().Name,
((Google.Protobuf.IMessage)packet.Message).ToString());
}
else
{
TraceLog.UserTraceDetail(iObjectID, "PackMessage send to server {0} msgId {1} iID {2} message {3} -> {4}"
, ServerIDUtils.IDToString(dstserverID), packet.MsgID, iObjectID
, packet.Message.GetType().Name,
((Google.Protobuf.IMessage)packet.Message).ToString());
}
}
return message;
}
/*
//以下方法都是要废弃的,battleServerID 和 gameServerID 都不唯一了,全部废弃 全部废弃 全部废弃
//目前只有game像battle发送消息
public void SendToBattleServer(UInt64 battleID, int iMsgID, Google.Protobuf.IMessage message, long iObjectID, uint headserverID = 0)
{
RequestPacket reqPacket = new RequestPacket(iMsgID, iObjectID, headserverID);
reqPacket.Message = message;
SendToServerByID(TransBattleIDToBattleServerID(battleID), reqPacket);
}
public void SendToBattleServer(UInt64 battleID, RequestPacket packet)
{
SendToServerByID(TransBattleIDToBattleServerID(battleID), packet, packet.ObjectID, packet.ServerID);
}
public void SendToBattleServer(UInt64 battleID, RequestPacket packet, long iObjectID, uint headserverID = 0)
{
SendToServerByID(TransBattleIDToBattleServerID(battleID), packet, iObjectID, headserverID);
}
//这里要删除,现在是多台game,有的要改成广播,有的必须指定
public void SendToGameServer(uint gameServerID, int iMsgID, Google.Protobuf.IMessage message, long iObjectID, uint headserverID = 0)
{
RequestPacket reqPacket = new RequestPacket(iMsgID, iObjectID, headserverID);
reqPacket.Message = message;
SendToServerByID(gameServerID, reqPacket);
}
public void SendToGameServer(uint gameServerID, RequestPacket packet)
{
SendToServerByID(gameServerID, packet, packet.ObjectID, packet.ServerID);
}
public void SendToGameServer(uint gameServerID, RequestPacket packet, long iObjectID, uint headserverID = 0)
{
SendToServerByID(gameServerID, packet, iObjectID, headserverID);
}
private uint TransBattleIDToBattleServerID(UInt64 battleID)
{
//转换为serverID
UInt64 iInstID = (battleID >> 48) & (0xffff);
uint battleServerID = ServerIDUtils.MakeServerID(1, (int)ServerType.Battle, (int)iInstID);
return battleServerID;
}
*/
}
}