From 5165b9e6dc457ccdfc8ad8331467135ee59121b2 Mon Sep 17 00:00:00 2001 From: qornwh1 Date: Sun, 8 Mar 2026 20:47:23 +0900 Subject: [PATCH] =?UTF-8?q?fix=20:=20playerID=20=3D=3D=20hashkey=20?= =?UTF-8?q?=ED=86=B5=EC=9D=BC=20/=20long=20=3D>=20int=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DummyService/DummyClients.cs | 6 +-- .../EchoClientTester/Packet/PacketBody.cs | 4 +- .../StressTest/StressTestClient.cs | 6 +-- .../StressTest/StressTestService.cs | 2 +- .../MMOserver/Game/Channel/Channel.cs | 16 +++---- .../MMOserver/Game/Channel/ChannelManager.cs | 12 ++--- MMOTestServer/MMOserver/Game/GameServer.cs | 44 +++++++++---------- MMOTestServer/MMOserver/Game/Player.cs | 2 +- MMOTestServer/MMOserver/Packet/PacketBody.cs | 4 +- .../MMOserver/Utils/UuidGenerator.cs | 14 +++--- MMOTestServer/ServerLib/Service/ServerBase.cs | 12 ++--- MMOTestServer/ServerLib/Service/Session.cs | 4 +- 12 files changed, 63 insertions(+), 63 deletions(-) diff --git a/ClientTester/EchoClientTester/DummyService/DummyClients.cs b/ClientTester/EchoClientTester/DummyService/DummyClients.cs index f9c10ce..f37b2c9 100644 --- a/ClientTester/EchoClientTester/DummyService/DummyClients.cs +++ b/ClientTester/EchoClientTester/DummyService/DummyClients.cs @@ -12,7 +12,7 @@ public class DummyClients private EventBasedNetListener listener; private NetDataWriter? writer; public NetPeer? peer; - public long clientId; // 일단 이게 hashKey가 됨 => 0 ~ 1000번까지는 더미용응로 뺴둠 + public int clientId; // 일단 이게 hashKey가 됨 => 0 ~ 1000번까지는 더미용응로 뺴둠 // info private Vector3 position = new Vector3(); @@ -50,7 +50,7 @@ public class DummyClients get; } - public DummyClients(long clientId, string ip, int port, string key) + public DummyClients(int clientId, string ip, int port, string key) { this.clientId = clientId; listener = new EventBasedNetListener(); @@ -139,7 +139,7 @@ public class DummyClients UpdateDummy(); TransformPlayerPacket transformPlayerPacket = new TransformPlayerPacket { - PlayerId = (int)clientId, + PlayerId = clientId, RotY = rotY, Position = new Packet.Vector3 { diff --git a/ClientTester/EchoClientTester/Packet/PacketBody.cs b/ClientTester/EchoClientTester/Packet/PacketBody.cs index 4ccef36..1cce4cc 100644 --- a/ClientTester/EchoClientTester/Packet/PacketBody.cs +++ b/ClientTester/EchoClientTester/Packet/PacketBody.cs @@ -125,7 +125,7 @@ public class PlayerInfo public class DummyAccTokenPacket { [ProtoMember(1)] - public long Token + public int Token { get; set; @@ -533,7 +533,7 @@ public enum PartyUpdateType public class UpdatePartyPacket { [ProtoMember(1)] - public int PartyId + public long PartyId { get; set; diff --git a/ClientTester/EchoClientTester/StressTest/StressTestClient.cs b/ClientTester/EchoClientTester/StressTest/StressTestClient.cs index 78a48fa..27b02be 100644 --- a/ClientTester/EchoClientTester/StressTest/StressTestClient.cs +++ b/ClientTester/EchoClientTester/StressTest/StressTestClient.cs @@ -18,7 +18,7 @@ public class StressTestClient private EventBasedNetListener listener; private NetDataWriter? writer; public NetPeer? peer; - public long clientId; + public int clientId; // 이동 private Vector3 position = new Vector3(); @@ -47,7 +47,7 @@ public class StressTestClient public double AvgRttMs => RttCount > 0 ? TotalRttMs / RttCount : 0; public bool IsConnected => peer != null; - public StressTestClient(long clientId, string ip, int port, string key) + public StressTestClient(int clientId, string ip, int port, string key) { this.clientId = clientId; listener = new EventBasedNetListener(); @@ -150,7 +150,7 @@ public class StressTestClient // 전송 TransformPlayerPacket pkt = new TransformPlayerPacket { - PlayerId = (int)clientId, + PlayerId = clientId, RotY = rotY, Position = new Packet.Vector3 { X = position.X, Y = 0, Z = position.Z } }; diff --git a/ClientTester/EchoClientTester/StressTest/StressTestService.cs b/ClientTester/EchoClientTester/StressTest/StressTestService.cs index 9002b99..d8498a2 100644 --- a/ClientTester/EchoClientTester/StressTest/StressTestService.cs +++ b/ClientTester/EchoClientTester/StressTest/StressTestService.cs @@ -107,7 +107,7 @@ public class StressTestService for (int i = 0; i < batch; i++) { - long id = created + 1; // 1-based (더미 범위) + int id = created + 1; // 1-based (더미 범위) StressTestClient client = new StressTestClient(id, ip, port, key); lock (clientsLock) { diff --git a/MMOTestServer/MMOserver/Game/Channel/Channel.cs b/MMOTestServer/MMOserver/Game/Channel/Channel.cs index 5325551..944178f 100644 --- a/MMOTestServer/MMOserver/Game/Channel/Channel.cs +++ b/MMOTestServer/MMOserver/Game/Channel/Channel.cs @@ -9,10 +9,10 @@ public class Channel private Robby robby = new Robby(); // 채널 내 유저 상태 (hashKey → Player) - private Dictionary connectUsers = new Dictionary(); + private Dictionary connectUsers = new Dictionary(); // 채널 내 유저 NetPeer (hashKey → NetPeer) — BroadcastToChannel 교차 조회 제거용 - private Dictionary connectPeers = new Dictionary(); + private Dictionary connectPeers = new Dictionary(); public int ChannelId { @@ -37,14 +37,14 @@ public class Channel ChannelId = channelId; } - public void AddUser(long userId, Player player, NetPeer peer) + public void AddUser(int userId, Player player, NetPeer peer) { connectUsers[userId] = player; connectPeers[userId] = peer; UserCount++; } - public void RemoveUser(long userId) + public void RemoveUser(int userId) { connectUsers.Remove(userId); connectPeers.Remove(userId); @@ -52,13 +52,13 @@ public class Channel } // 재연결(WiFi→LTE 등) 시 동일 유저의 peer 교체 - public void UpdatePeer(long userId, NetPeer peer) + public void UpdatePeer(int userId, NetPeer peer) { connectPeers[userId] = peer; } // 채널 내 모든 유저의 hashKey 반환 (채널 입장 시 기존 플레이어 목록 조회용) - public IEnumerable GetConnectUsers() + public IEnumerable GetConnectUsers() { return connectUsers.Keys; } @@ -76,13 +76,13 @@ public class Channel } // 특정 유저의 Player 반환 - public Player? GetPlayer(long userId) + public Player? GetPlayer(int userId) { connectUsers.TryGetValue(userId, out Player? player); return player; } - public int HasUser(long userId) + public int HasUser(int userId) { if (connectUsers.ContainsKey(userId)) { diff --git a/MMOTestServer/MMOserver/Game/Channel/ChannelManager.cs b/MMOTestServer/MMOserver/Game/Channel/ChannelManager.cs index 8d238c8..f2417a7 100644 --- a/MMOTestServer/MMOserver/Game/Channel/ChannelManager.cs +++ b/MMOTestServer/MMOserver/Game/Channel/ChannelManager.cs @@ -1,4 +1,4 @@ -using LiteNetLib; +using LiteNetLib; using MMOserver.Utils; namespace MMOserver.Game.Channel; @@ -9,7 +9,7 @@ public class ChannelManager : Singleton private List channels = new List(); // 채널별 유저 관리 (유저 key, 채널 val) - private Dictionary connectUsers = new Dictionary(); + private Dictionary connectUsers = new Dictionary(); public ChannelManager() { @@ -34,7 +34,7 @@ public class ChannelManager : Singleton return channels; } - public void AddUser(int channelId, long userId, Player player, NetPeer peer) + public void AddUser(int channelId, int userId, Player player, NetPeer peer) { // 유저 추가 connectUsers.Add(userId, channelId); @@ -42,7 +42,7 @@ public class ChannelManager : Singleton channels[channelId].AddUser(userId, player, peer); } - public bool RemoveUser(long userId) + public bool RemoveUser(int userId) { // 채널에 없는 유저면 스킵 if (!connectUsers.TryGetValue(userId, out int channelId)) @@ -61,7 +61,7 @@ public class ChannelManager : Singleton return false; } - public int HasUser(long userId) + public int HasUser(int userId) { int channelId = -1; if (connectUsers.ContainsKey(userId)) @@ -77,7 +77,7 @@ public class ChannelManager : Singleton return channelId; } - public Dictionary GetConnectUsers() + public Dictionary GetConnectUsers() { return connectUsers; } diff --git a/MMOTestServer/MMOserver/Game/GameServer.cs b/MMOTestServer/MMOserver/Game/GameServer.cs index be8048d..bd30085 100644 --- a/MMOTestServer/MMOserver/Game/GameServer.cs +++ b/MMOTestServer/MMOserver/Game/GameServer.cs @@ -13,12 +13,12 @@ namespace MMOserver.Game; public class GameServer : ServerBase { - private readonly Dictionary> packetHandlers; + private readonly Dictionary> packetHandlers; private UuidGenerator userUuidGenerator; public GameServer(int port, string connectionString) : base(port, connectionString) { - packetHandlers = new Dictionary> + packetHandlers = new Dictionary> { [(ushort)PacketCode.INTO_CHANNEL] = OnIntoChannel, [(ushort)PacketCode.EXIT_CHANNEL] = OnExitChannel, @@ -51,7 +51,7 @@ public class GameServer : ServerBase protected override void HandleAuthDummy(NetPeer peer, byte[] payload) { DummyAccTokenPacket accTokenPacket = Serializer.Deserialize(new ReadOnlyMemory(payload)); - long hashKey = accTokenPacket.Token; + int hashKey = accTokenPacket.Token; if (sessions.TryGetValue(hashKey, out NetPeer? existing)) { @@ -73,8 +73,8 @@ public class GameServer : ServerBase Player newPlayer = new Player { HashKey = hashKey, - PlayerId = (int)(hashKey & 0x7FFFFFFF), - Nickname = (hashKey & 0x7FFFFFFF).ToString() + PlayerId = hashKey, + Nickname = hashKey.ToString() }; cm.AddUser(1, hashKey, newPlayer, peer); @@ -94,7 +94,7 @@ public class GameServer : ServerBase { AccTokenPacket accTokenPacket = Serializer.Deserialize(new ReadOnlyMemory(payload)); string token = accTokenPacket.Token; - tokenHash.TryGetValue(token, out long hashKey); + tokenHash.TryGetValue(token, out int hashKey); if (hashKey <= 1000) { hashKey = userUuidGenerator.Create(); @@ -133,7 +133,7 @@ public class GameServer : ServerBase OnSessionConnected(peer, hashKey); } - protected override void OnSessionConnected(NetPeer peer, long hashKey) + protected override void OnSessionConnected(NetPeer peer, int hashKey) { Log.Information("[GameServer] 세션 연결 HashKey={Key} PeerId={Id}", hashKey, peer.Id); @@ -154,7 +154,7 @@ public class GameServer : ServerBase } } - protected override void OnSessionDisconnected(NetPeer peer, long hashKey, DisconnectInfo info) + protected override void OnSessionDisconnected(NetPeer peer, int hashKey, DisconnectInfo info) { ChannelManager cm = ChannelManager.Instance; @@ -176,9 +176,9 @@ public class GameServer : ServerBase userUuidGenerator.Release(hashKey); } - protected override void HandlePacket(NetPeer peer, long hashKey, ushort type, byte[] payload) + protected override void HandlePacket(NetPeer peer, int hashKey, ushort type, byte[] payload) { - if (packetHandlers.TryGetValue(type, out Action? handler)) + if (packetHandlers.TryGetValue(type, out Action? handler)) { handler(peer, hashKey, payload); } @@ -192,7 +192,7 @@ public class GameServer : ServerBase // 보내는 패킷 // ============================================================ - private void SendLoadChannelPacket(NetPeer peer, long hashKey) + private void SendLoadChannelPacket(NetPeer peer, int hashKey) { LoadChannelPacket loadChannelPacket = new LoadChannelPacket(); foreach (Channel.Channel channel in ChannelManager.Instance.GetChannels()) @@ -209,7 +209,7 @@ public class GameServer : ServerBase } // 나간 유저를 같은 채널 유저들에게 알림 (UPDATE_CHANNEL_USER IsAdd=false) - private void SendExitChannelPacket(NetPeer peer, long hashKey, int channelId, Player player) + private void SendExitChannelPacket(NetPeer peer, int hashKey, int channelId, Player player) { UpdateChannelUserPacket packet = new UpdateChannelUserPacket { @@ -224,7 +224,7 @@ public class GameServer : ServerBase // 채널 입장 시 패킷 전송 // - 새 유저에게 : 기존 채널 유저 목록 (INTO_CHANNEL) // - 기존 유저들에게 : 새 유저 입장 알림 (UPDATE_CHANNEL_USER IsAdd=true) - private void SendIntoChannelPacket(NetPeer peer, long hashKey) + private void SendIntoChannelPacket(NetPeer peer, int hashKey) { ChannelManager cm = ChannelManager.Instance; int channelId = cm.HasUser(hashKey); @@ -238,7 +238,7 @@ public class GameServer : ServerBase // 1. 새 유저에게: 자신을 제외한 기존 채널 유저 목록 전송 IntoChannelPacket response = new IntoChannelPacket { ChannelId = channelId }; - foreach (long userId in channel.GetConnectUsers()) + foreach (int userId in channel.GetConnectUsers()) { if (userId == hashKey) { @@ -270,7 +270,7 @@ public class GameServer : ServerBase // 채널 입장 시 패킷 전송 // - 자신 유저에게 : 내 정보 (LOAD_GAME) - private void SendLoadGame(NetPeer peer, long hashKey) + private void SendLoadGame(NetPeer peer, int hashKey) { ChannelManager cm = ChannelManager.Instance; int channelId = cm.HasUser(hashKey); @@ -340,7 +340,7 @@ public class GameServer : ServerBase // 패킷 핸들러 // ============================================================ - private void OnIntoChannel(NetPeer peer, long hashKey, byte[] payload) + private void OnIntoChannel(NetPeer peer, int hashKey, byte[] payload) { IntoChannelPacket packet = Serializer.Deserialize(new ReadOnlyMemory(payload)); @@ -361,8 +361,8 @@ public class GameServer : ServerBase Player newPlayer = new Player { HashKey = hashKey, - PlayerId = (int)(hashKey & 0x7FFFFFFF), - Nickname = (hashKey & 0x7FFFFFFF).ToString() + PlayerId = hashKey, + Nickname = hashKey.ToString() }; cm.AddUser(packet.ChannelId, hashKey, newPlayer, peer); @@ -375,7 +375,7 @@ public class GameServer : ServerBase SendLoadGame(peer, hashKey); } - private void OnExitChannel(NetPeer peer, long hashKey, byte[] payload) + private void OnExitChannel(NetPeer peer, int hashKey, byte[] payload) { ExitChannelPacket packet = Serializer.Deserialize(new ReadOnlyMemory(payload)); @@ -395,7 +395,7 @@ public class GameServer : ServerBase } } - private void OnTransformPlayer(NetPeer peer, long hashKey, byte[] payload) + private void OnTransformPlayer(NetPeer peer, int hashKey, byte[] payload) { TransformPlayerPacket packet = Serializer.Deserialize(new ReadOnlyMemory(payload)); @@ -421,7 +421,7 @@ public class GameServer : ServerBase BroadcastToChannel(channelId, data, peer, DeliveryMethod.Unreliable); } - private void OnActionPlayer(NetPeer peer, long hashKey, byte[] payload) + private void OnActionPlayer(NetPeer peer, int hashKey, byte[] payload) { ActionPlayerPacket packet = Serializer.Deserialize(new ReadOnlyMemory(payload)); @@ -437,7 +437,7 @@ public class GameServer : ServerBase BroadcastToChannel(channelId, data, peer); } - private void OnStatePlayer(NetPeer peer, long hashKey, byte[] payload) + private void OnStatePlayer(NetPeer peer, int hashKey, byte[] payload) { StatePlayerPacket packet = Serializer.Deserialize(new ReadOnlyMemory(payload)); diff --git a/MMOTestServer/MMOserver/Game/Player.cs b/MMOTestServer/MMOserver/Game/Player.cs index 57a899f..6ad8325 100644 --- a/MMOTestServer/MMOserver/Game/Player.cs +++ b/MMOTestServer/MMOserver/Game/Player.cs @@ -2,7 +2,7 @@ namespace MMOserver.Game; public class Player { - public long HashKey + public int HashKey { get; set; diff --git a/MMOTestServer/MMOserver/Packet/PacketBody.cs b/MMOTestServer/MMOserver/Packet/PacketBody.cs index 65d3c3b..7f4199f 100644 --- a/MMOTestServer/MMOserver/Packet/PacketBody.cs +++ b/MMOTestServer/MMOserver/Packet/PacketBody.cs @@ -125,7 +125,7 @@ public class PlayerInfo public class DummyAccTokenPacket { [ProtoMember(1)] - public long Token + public int Token { get; set; @@ -533,7 +533,7 @@ public enum PartyUpdateType public class UpdatePartyPacket { [ProtoMember(1)] - public int PartyId + public long PartyId { get; set; diff --git a/MMOTestServer/MMOserver/Utils/UuidGenerator.cs b/MMOTestServer/MMOserver/Utils/UuidGenerator.cs index ed8ff16..cb8a161 100644 --- a/MMOTestServer/MMOserver/Utils/UuidGenerator.cs +++ b/MMOTestServer/MMOserver/Utils/UuidGenerator.cs @@ -3,20 +3,20 @@ namespace MMOserver.Utils; public class UuidGenerator { // 0 ~ 1000 은 더미 클라이언트 예약 범위 - private const long DUMMY_RANGE_MAX = 1000; + private const int DUMMY_RANGE_MAX = 1000; private readonly object idLock = new(); - private readonly HashSet usedIds = new(); + private readonly HashSet usedIds = new(); - // 고유 랜덤 long ID 발급 (1001번 이상, 충돌 시 재생성) - public long Create() + // 고유 랜덤 int ID 발급 (1001번 이상, 충돌 시 재생성) + public int Create() { lock (idLock) { - long id; + int id; do { - id = Random.Shared.NextInt64(DUMMY_RANGE_MAX + 1, long.MaxValue); + id = Random.Shared.Next(DUMMY_RANGE_MAX + 1, int.MaxValue); } while (usedIds.Contains(id)); usedIds.Add(id); @@ -25,7 +25,7 @@ public class UuidGenerator } // 로그아웃 / 세션 만료 시 ID 반납 - public bool Release(long id) + public bool Release(int id) { lock (idLock) { diff --git a/MMOTestServer/ServerLib/Service/ServerBase.cs b/MMOTestServer/ServerLib/Service/ServerBase.cs index a34ea84..8eecf77 100644 --- a/MMOTestServer/ServerLib/Service/ServerBase.cs +++ b/MMOTestServer/ServerLib/Service/ServerBase.cs @@ -15,7 +15,7 @@ namespace ServerLib.Service; /// /// 흐름: /// OnPeerConnected → 대기 목록 등록 -/// OnNetworkReceive → Auth 패킷(type=1)이면 HashKey(8byte long) 읽어 인증 +/// OnNetworkReceive → Auth 패킷(type=1)이면 HashKey(4byte int) 읽어 인증 /// → 이미 같은 HashKey 세션 있으면 이전 피어 끊고 재연결 (WiFi→LTE) /// → 그 외 패킷은 HandlePacket() 으로 전달 /// OnPeerDisconnected → 세션/대기 목록에서 제거 @@ -34,10 +34,10 @@ public abstract class ServerBase : INetEventListener // 인증된 세션 (hashKey → NetPeer) 재연결 조회용 // peer → hashKey 역방향은 peer.Tag as Session 으로 대체 - protected readonly Dictionary sessions = new(); + protected readonly Dictionary sessions = new(); // Token / HashKey 관리 - protected readonly Dictionary tokenHash = new(); + protected readonly Dictionary tokenHash = new(); // 재사용 NetDataWriter (단일 스레드 폴링이므로 안전) private readonly NetDataWriter cachedWriter = new(); @@ -271,11 +271,11 @@ public abstract class ServerBase : INetEventListener // ─── 서브클래스 구현 ───────────────────────────────────────────────── // 인증(Auth) 완료 후 호출 - protected abstract void OnSessionConnected(NetPeer peer, long hashKey); + protected abstract void OnSessionConnected(NetPeer peer, int hashKey); // 세션 정상 해제 시 호출 (재연결 교체 시에는 호출되지 않음) - protected abstract void OnSessionDisconnected(NetPeer peer, long hashKey, DisconnectInfo info); + protected abstract void OnSessionDisconnected(NetPeer peer, int hashKey, DisconnectInfo info); // 인증된 피어의 게임 패킷 수신 / payload는 헤더 제거된 raw bytes → 실행 프로젝트에서 protobuf 역직렬화 - protected abstract void HandlePacket(NetPeer peer, long hashKey, ushort type, byte[] payload); + protected abstract void HandlePacket(NetPeer peer, int hashKey, ushort type, byte[] payload); } diff --git a/MMOTestServer/ServerLib/Service/Session.cs b/MMOTestServer/ServerLib/Service/Session.cs index 2f4575d..c847289 100644 --- a/MMOTestServer/ServerLib/Service/Session.cs +++ b/MMOTestServer/ServerLib/Service/Session.cs @@ -10,7 +10,7 @@ public class Session set; } - public long HashKey + public int HashKey { get; init; @@ -63,7 +63,7 @@ public class Session RateLimitViolations = 0; } - public Session(long hashKey, NetPeer peer, int maxPacketsPerSecond = 60) + public Session(int hashKey, NetPeer peer, int maxPacketsPerSecond = 60) { HashKey = hashKey; Peer = peer;