🌞 소켓 프로그래밍의 흐름
손님 입장 (클라이언트)
1) 서버와 연락할 핸드폰을 준비한다.
2) 식당 번호로 입장을 문의한다.
=> 결과 : 손님들을 대표하는 대리인이 식당에 가게되고,
손님은 휴대폰을 통해서 대리인과 연락이 가능하다.
1) 소켓 준비
2) 서버 주소로 Connect
소켓을 통해 Session 소켓과 패킷 송수신 가능
식당 입장 (서버)
1) 문지기를 고용한다.
2) 문지기를 교육한다.(식당 번호를 알려준다)
3) 영업을 시작한다. 최대 수용량을 초과하면 영업은 시작하지 않는다.
4) 손님의 대리인을 받는다.
손님 대리인을 통해 손님과 대화가 가능하다.
1) Listener 소켓 준비
2) Bind ( 서버 주소/Port를 소켓에 연동 )
3) Listen
4) Accept
클라 세션을 통해 손님과 통화가 가능하다.
🌞 소켓 프로그래밍 실습
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace ServerCore
{
class Program
{
static void Main(string[] args)
{
//DNS(Domain Name Service
string host = Dns.GetHostName();
IPHostEntry ipHost = Dns.GetHostEntry(host);
IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint endPoint = new IPEndPoint(ipAddr, 7777);
//문지기
Socket listenSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
//문지기 교육
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();
}
}
}
}
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace DummyClient
{
class Program
{
static void Main(string[] args)
{
try
{
//DNS(Domain Name Service
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);
// 문지기한테 입장 문의
socket.Connect(endPoint);
Console.WriteLine($"Connected to {socket.RemoteEndPoint.ToString()}");
// 보낸다
byte[] sendBuff = Encoding.UTF8.GetBytes("Hello World!");
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);
}
}
}
}