728x90
서버와 클라이언트가 통신하기 위해서 서로 연결된 가상의 도로를 만드는데 이 도로의 양 끝을 소켓이라 부른다. 소켓 프로그래밍이란 네트워크를 통해 두 시스템이 소통하는 것을 말한다.
서버
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace Server
{
class Program
{
static void Main(string[] args)
{
// 내 컴퓨터 IP 주소의 문자 이름을 받아오는 함수다.
string host = Dns.GetHostName();
// GetHostEntry를 통해 뽑아온 host의 IP 정보, Alias 정보 등을 IPHostEntry에 담는다.
IPHostEntry ipHost = Dns.GetHostEntry(host);
// IPAddress는 IP 주소를 제공한다.
// 구글처럼 트래픽이 많은 경우 1번 주소, 2번 주소 등 사용자 분산을 위해 AddressList가 필요한 경우가 있다.
IPAddress ipAddr = ipHost.AddressList[0];
// endPoint는 최종주소(ex. 식당의 주소). 7777는 포트번호를 말한다(ex. 식당의 앞문인지 뒷문인지).
IPEndPoint endPoint = new IPEndPoint(ipAddr, 7777);
// TCP 환경을 사용하기 위한 기본적인 Socket 설정이다.
Socket listenSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try
{
listenSocket.Bind(endPoint);
listenSocket.Listen(10);
while (true)
{
Console.WriteLine("대기...");
// 클라의 접속을 받아들인다.
Socket clientSocket = listenSocket.Accept();
// 클라가 보낸 내용을 받는 부분
byte[] recvBuff = new byte[1024]; // 클라가 보낸 내용을 1024크기의 박스에 넣을 준비.
int recvBytes = clientSocket.Receive(recvBuff); // 내용을 받는다.
string recvData = Encoding.UTF8.GetString(recvBuff, 0, recvBytes); // 받은 내용을 UTF8로 인코딩해서 recvData에 넣어준다.
Console.WriteLine($"From Client : {recvData}");
// 서버가 클라한테 내용을 보낼 준비
Console.Write("To Client : ");
string myMent = Console.ReadLine();
byte[] sendBuff = Encoding.UTF8.GetBytes(myMent); // 클라에게 보낼 멘트 byte 타입으로 정리한다.
clientSocket.Send(sendBuff); // 정리한 byte 멘트 보낸다.
// 서로 볼 일 다 봤으니 빠빠이
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
}
클라이언트
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace Client
{
class Program
{
static void Main(string[] args)
{
// 서버와 같은 내용이다.
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}");
// 클라에서 서버로 내용 전송
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 ex)
{
Console.WriteLine(ex.ToString());
}
}
}
}
프로그램을 실행하면
뒤에 열린 클라이언트 창에서는 서버가 자신에게 어떤 정보를 보낼지 무한 대기하며 기다리게 된다. 물론 자신이 서버에게 보낸 Hello World는 정상적으로 출력된 상태다.
서버에서 hi라는 말을 전달하면 클라이언트에서 정상적으로 hi를 받고 출력한다. 이렇게 아주아주 간단한 소켓 클라이언트가 완성됐다.
728x90
'공부 > 게임 서버' 카테고리의 다른 글
[게임 서버] Listener의 반대 개념, Connector에 대해서 (0) | 2022.06.20 |
---|---|
[게임 서버] 소켓 프로그래밍 BufferList를 사용하여 한 번에 Send (0) | 2022.06.18 |
[게임 서버] 파싱(Parsing)이란? (0) | 2022.06.04 |
[게임 서버] DNS란? (0) | 2022.06.04 |
[게임 서버] TCP와 UDP (0) | 2022.06.02 |