Repository navigation
Expand file tree
/
Copy pathMainServer.cs
More file actions
161 lines (139 loc) · 4.71 KB
/
Copy pathMainServer.cs
File metadata and controls
161 lines (139 loc) · 4.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
using System;
using System.Collections.Generic;
using SuperSocketLite.SocketBase;
using SuperSocketLite.SocketBase.Protocol;
using SuperSocketLite.SocketBase.Config;
namespace EchoServerEx;
/// <summary>
/// 메인 서버 클래스입니다.
/// </summary>
class MainServer : AppServer<NetworkSession, EFBinaryRequestInfo>
{
/// <summary>
/// 메인 로거 인스턴스입니다.
/// </summary>
public static SuperSocketLite.SocketBase.Logging.ILog s_MainLogger;
/// <summary>
/// 패킷 핸들러 맵입니다.
/// </summary>
Dictionary<int, Action<NetworkSession, EFBinaryRequestInfo>> HandlerMap = new Dictionary<int, Action<NetworkSession, EFBinaryRequestInfo>>();
/// <summary>
/// 공통 핸들러 인스턴스입니다.
/// </summary>
CommonHandler _commonHandler = new CommonHandler();
/// <summary>
/// 서버 설정 인스턴스입니다.
/// </summary>
IServerConfig _config;
/// <summary>
/// MainServer 클래스의 생성자입니다.
/// </summary>
public MainServer()
: base(new DefaultReceiveFilterFactory<ReceiveFilter, EFBinaryRequestInfo>())
{
NewSessionConnected += new SessionHandler<NetworkSession>(OnConnected);
SessionClosed += new SessionHandler<NetworkSession, CloseReason>(OnClosed);
NewRequestReceived += new RequestHandler<NetworkSession, EFBinaryRequestInfo>(RequestReceived);
}
/// <summary>
/// 핸들러를 등록합니다.
/// </summary>
void RegistHandler()
{
HandlerMap.Add((int)PacketId.ReqEcho, _commonHandler.RequestEcho);
s_MainLogger.Info("핸들러 등록 완료");
}
/// <summary>
/// 서버 설정을 초기화합니다.
/// </summary>
/// <param name="option">서버 옵션</param>
public void InitConfig(ServerOption option)
{
_config = new ServerConfig
{
Port = option.Port,
Ip = "Any",
MaxConnectionNumber = option.MaxConnectionNumber,
Mode = SocketMode.Tcp,
Name = option.Name
};
}
/// <summary>
/// 서버를 생성합니다.
/// </summary>
public void CreateServer()
{
try
{
bool isResult = Setup(new RootConfig(), _config, logFactory: new NLogLogFactory());
if (isResult == false)
{
Console.WriteLine("[ERROR] 서버 네트워크 설정 실패 ㅠㅠ");
return;
}
else
{
s_MainLogger = base.Logger;
}
RegistHandler();
s_MainLogger.Info("서버 생성 성공");
}
catch (Exception ex)
{
Console.WriteLine($"[ERROR] 서버 생성 실패: {ex.ToString()}");
}
}
/// <summary>
/// 서버가 실행 중인지 확인합니다.
/// </summary>
/// <param name="curState">현재 서버 상태</param>
/// <returns>서버가 실행 중인지 여부</returns>
public bool IsRunning(ServerState curState)
{
if (curState == ServerState.Running)
{
return true;
}
return false;
}
/// <summary>
/// 클라이언트가 접속했을 때 호출되는 이벤트 핸들러입니다.
/// </summary>
/// <param name="session">접속한 클라이언트 세션</param>
void OnConnected(NetworkSession session)
{
s_MainLogger.Info($"세션 번호 {session.SessionID} 접속");
}
/// <summary>
/// 클라이언트가 접속을 해제했을 때 호출되는 이벤트 핸들러입니다.
/// </summary>
/// <param name="session">해제된 클라이언트 세션</param>
/// <param name="reason">접속 해제 사유</param>
void OnClosed(NetworkSession session, CloseReason reason)
{
s_MainLogger.Info($"세션 번호 {session.SessionID} 접속해제: {reason.ToString()}");
}
/// <summary>
/// 클라이언트로부터 요청을 받았을 때 호출되는 이벤트 핸들러입니다.
/// </summary>
/// <param name="session">요청을 받은 클라이언트 세션</param>
/// <param name="reqInfo">받은 요청 정보</param>
void RequestReceived(NetworkSession session, EFBinaryRequestInfo reqInfo)
{
var packetId = reqInfo.PacketID;
if (HandlerMap.ContainsKey(packetId))
{
HandlerMap[packetId](session, reqInfo);
}
else
{
s_MainLogger.Info($"세션 번호 {session.SessionID}, 받은 데이터 크기: {reqInfo.Body.Length}");
}
}
}
/// <summary>
/// 네트워크 세션 클래스입니다.
/// </summary>
public class NetworkSession : AppSession<NetworkSession, EFBinaryRequestInfo>
{
}