반응형
인프런 - Rookies님의 강의
https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part4
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버 - 인프런 | 강의
네트워크/멀티쓰레드/운영체제 등 핵심 전공 지식을 공부하고 게임 서버를 바닥부터 만들어보면서 MMORPG 기술을 학습하는 강의입니다., MMORPG 개발에 필요한 모든 기술, C# + Unity로 Step By Step! 🕹
www.inflearn.com
소켓 프로그래밍 입문
소켓 프로그래밍으로 간단한 서버와 클라이언트 간의 통신을 구현한다.
서버(ServerCore)는 클라이언트의 연결을 받아들이고 데이터를 주고받는 역할을 한다.
클라이언트(DummyClient)는 서버에 연결하여 데이터를 보내고 받는 역할을 한다.
서버 역할을 할 ServerCore 스크립트
namespace ServerCore
{
class Program
{
static void Main(string[] args)
{
// DNS (Domain Name System)
// 123.1.2.3 와 같이 IP가 하드코딩 되어 있으면 IP가 바뀔 일이 있을 때 문제가 생김
// => www.naver.com -> 123.1.2.3 : 이름으로 IP를 찾음
string host = Dns.GetHostName();
IPHostEntry ipHost = Dns.GetHostEntry(host);
// 구글과 같이 트래픽이 많은경우, 주소를 다르게 알려줘서 부하를 분산하는데
// 경우에 따라서 여러개의 IP주소를 알려줄 수 있도록 반환형이 배열
IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint endPoint = new IPEndPoint(ipAddr, 7777);
// 문지기
Socket listenSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try
{
// 문지기 교육
listenSocket.Bind(endPoint);
// 영업 시작
// backlog : 최대 대기수
listenSocket.Listen(10);
while (true)
{
Console.WriteLine("Listening...");
// 손님을 입장시킨다
Socket clientSocket = listenSocket.Accept();
// 받는다
byte[] recvBuff = new byte[1024];
int recvBytes = clientSocket.Receive(recvBuff);
string recvData = Encoding.UTF8.GetString(recvBuff, 0, recvBytes);
Console.WriteLine($"[From Client] {recvData}");
// 보낸다
byte[] sendBuff = Encoding.UTF8.GetBytes("Welcome to MMORPG Server !");
clientSocket.Send(sendBuff);
// 쫓아낸다
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
}
}
클라이언트 역할을 할 DummyClient 스크립트
namespace DummyClient
{
class Program
{
static void Main(string[] args)
{
// DNS (Domain Name System)
string host = Dns.GetHostName();
IPHostEntry ipHost = Dns.GetHostEntry(host);
IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint endPoint = new IPEndPoint(ipAddr, 7777);
// 휴대폰 설정
Socket socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try
{
// 문지기한테 입장 문의
socket.Connect(endPoint);
Console.WriteLine($"Connected to {socket.RemoteEndPoint.ToString()}");
// 보낸다
byte[] sendBuff = Encoding.UTF8.GetBytes("Hello World!");
int sendBytes = socket.Send(sendBuff);
// 받는다
byte[] recvBuff = new byte[1024];
int recvBytes = socket.Receive(recvBuff);
string recvData = Encoding.UTF8.GetString(recvBuff, 0, recvBytes);
Console.WriteLine($"[From Server] {recvData}");
// 나간다
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
}
}
반응형
'C# > C# 서버' 카테고리의 다른 글
[C#/서버] ReaderWriterLock (0) | 2023.08.22 |
---|---|
[C#/서버] AutoResetEvent / ManualResetEvent (0) | 2023.08.20 |
[C#/서버] SpinLock (0) | 2023.08.18 |
[C#/서버] 메모리 배리어 (0) | 2023.08.16 |
[C#/서버] 캐시 이론 (0) | 2023.08.16 |