지금까지 배운 소켓프로그래밍으로 채팅을 주고 받는걸 구현해보고자 한다.
채팅방 시스템이 어떻게 구현되어있는지를 예상해서 구성해보자면
1.더미 클라이언트 2개를 두고(완성하고 나면 2개 이상으로 확장 할 생각)
2. 서버에서 빈 채팅방 3개를 미리 만들어놓는다.
3.클라이언트는 서버에 연결을 성공하면 채팅방 목록을 볼수있게되며 채팅방에 입장을 시도한다.
4.서버는 입장요청을 받고 해당 클라 세션을 채팅방에 넣어준다.
5.채팅방에 여러개의 세션이 존재하게 되고, 누군가 채팅을 치면 패킷을 parsing해서 채팅방에 있는 모두에게 broadcast를 해준다.
이것을 위해서 이번 시간에 해야할 절차는
1.listener 소켓을 만들어서 서버의 ip주소와 포트에 bind시킨다.
2.클라이언트마다 connector소켓이 존재할텐데, 서버의 ip주소와 포트를 이용해 listener에게 connect요청을 보낸다,
3.listen 소켓이 요청을 받고 accept를하면 연결에 성공하고 서버에는 클라 세션, 클라에는 서버 세션을 만들어준다.
using Server;
using ServerCore;
using System.Net;
namespace Server
{
internal class Program
{
static Listener _listener = new Listener();
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);
Console.WriteLine(endPoint);
_listener.Init(endPoint, () => { return SessionManager.Instance.Generate(); });
while (true) { }
}
}
}
처음으로 ip와 포트를 설정해서 endPoint를 만들고 listener에다 해당 값으로 설정하도록 보내준다.
using ServerCore;
using System.Net;
namespace DummyClient1
{
internal 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);
Console.WriteLine(endPoint);
Connector connector = new Connector();
connector.Connect(endPoint, () => { return SessionManager.Instance.Generate(); });
while (true)
{
}
}
}
}
클라이언트도 서버의 주소와 사용할 포트를endPoint로 설정해주고 해당 주소에 연결요청을 하기위한 목적으로 사용한다.
서버 측에서는 여러 클라이언트로부터 세션을 만들기때문에 세션에 ID를 부여해준다.
반면 클라는 서버세션을 1개만 가지고있기때문에 ID를 만들 필요가 없다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Server
{
internal class SessionManager
{
static SessionManager _session = new SessionManager();
public static SessionManager Instance { get { return _session; } }
int _sessionID = 0;
Dictionary<int, ClientSession> _sessions = new Dictionary<int, ClientSession>();
object _lock = new object();
public ClientSession Generate()
{
ClientSession session = new ClientSession();
session.sessionID = ++_sessionID;
_sessions.Add(session.sessionID, session);
Console.WriteLine($"Connected {_sessionID}");
return session;
}
}
}


클라 측

서버 측
성공적으로 연결되었고 주소도 잘 뜬다.
다음글에서는 서버측에서 연결에 성공했으면 환영 메시지를 패킷으로 만들어서 보내는걸 구현해보겠습니다.
'서버 공부' 카테고리의 다른 글
| [서버 공부]미니 프로젝트 채팅 방 만들 3편 (0) | 2025.02.11 |
|---|---|
| [서버 공부] 미니 프로젝트: 채팅 방 만들기 2편 (0) | 2025.02.02 |
| [서버 공부]19. Job Queue1,2 (0) | 2025.01.28 |
| [서버 공부]18. Packet Generator 3,4,5,6 (0) | 2025.01.27 |
| [서버 공부]17.Packet Generator 1,2 (0) | 2025.01.24 |