ServerCore는 Server 라이브러리와 같다.
Server의 경우 사용 목적에 따라 다양한 서버를 생성하기 때문에 이는 컨텐츠 부분에 해당한다.
ServerCore는 Server가 공통적으로 사용할 핵심 부분을 구현하기에 이는 엔진 부분에 해당한다.
세션은 엔진 부분에 해당한다.
public abstract void OnConnected(EndPoint endPoint);
public abstract void OnRecv(ArraySegment<byte> buffer);
public abstract void OnSend(int numOfBytes);
public abstract void OnDisconnected(EndPoint endPoint);
4개의 함수를 abstract로 선언하였다.
Session을 상속하는 클래스는 위의 함수들을 구현하여야 한다.
OnRecv 는 OnRecvCompleted
OnSend 는 OnSendCompleted
OnDisconnected는 Disconnect 함수에 넣어주었다.
OnConnected의 경우 Session 안에서는 넣어줄 만한 곳이 없다.
Listener.cs에서 Accept를 하기 때문에 해당 스크립트에 작성하여야 한다.
Func<Session> _sessionFactory;
Func은 괄호 안의 타입을 반환하는 함수를 받는 delegate이다.
public void Init(IPEndPoint endPoint, Func<Session> sessionFactory)
{
_listenSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
_sessionFactory += sessionFactory;
}
Init할 때 sessionFactory를 넣어준다.
세션은 컨텐츠에서 설정하므로 컨텐츠 파트인 Program.cs에서 설정하였다.
void OnAcceptCompleted(object sender, SocketAsyncEventArgs args)
{
if (args.SocketError == SocketError.Success)
{
Session session = _sessionFactory.Invoke();
session.Start(args.AcceptSocket);
session.OnConnected(args.AcceptSocket.RemoteEndPoint);
}
else
Console.WriteLine(args.SocketError.ToString());
// Accept되면 다시 Register한다.
RegisterAccept(args);
}
_sessionFactory에 등록된 session을 가지고 OnConnected 함수를 실행한다.
_listener.Init(endPoint, () => { return new GameSession(); });
Init함수에서 새 GameSession을 반환하는 람다함수를 위의 _sessionFactory에 등록했다.