클라이언트 준비하기
서버 프로그램 하나, 클라이언트 프로그램 하나를 간단하게 만들어서 가볍게 문자열 정도 주고 받는 프로그램을 만들어보 려 한다.
먼저 클라이언트 쪽 코드를 작성해보자.
class Program
{
static void Main(string[] args)
{
ClientManager.Instance().ConnectToServer();
}
}
Program 클래스를 이용해서 ClientManager 클래스 내부의 ConnectToServer() 함수를 호출한다.
public void ConnectToServer()
{
// (1) IP 주소와 포트를 지정하고 TCP 연결
while (true)
{
try
{
Console.WriteLine("Client 연결 요청 중 . . .");
Client = new TcpClient("127.0.0.1", 7000);
Thread.Sleep(1000);
break;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
Console.WriteLine("서버 연결 완료 !! ==============================");
SendDataToServer();
}
TcpClient 를 생성해주고, 서버의 IP 주소 및 포트번호를 생성자로 넘겨주면 서버와 연결할 준비는 마쳤다. try - catch 를 이용해서 서버와의 연결이 실패했을 경우를 대비해주고, while 문을 통해 서버와 연결이 성공할 때까지 계속 해서 시도해주도록 하자.
이제 서버와 연결이 완료 되었다면, SendDataToServer() 함수를 이용해 서버에 데이터를 보내보자.
public void SendDataToServer()
{
Console.WriteLine("서버로 데이터 보내는 중 . . .");
string Msg = "Hello World";
byte[] Buff = Encoding.ASCII.GetBytes(Msg);
int Nbytes = 0;
NetworkStream Stream = Client.GetStream();
// 서버로 보내는 데이터
Stream.Write(Buff, 0, Buff.Length);
// 서버로 부터 받을 데이터 준비
byte[] Outbuf = new byte[1024];
while ((Nbytes = Stream.Read(Outbuf, 0, Outbuf.Length)) > 0)
{
string receivedData = Encoding.ASCII.GetString(Buff, 0, Nbytes);
Console.WriteLine("서버로부터 받은 데이터 : " + receivedData);
}
Stream.Close();
Client.Close();
}
데이터를 보내기 위해 byte[] 형식의 버퍼를 준비해주고, 만들어둔 Tcp 객체를 이용해 네트워크 스트림을 가져와 서버와 통신을 해보자. Write() 함수를 이용하면 데이터를 서버에 보낼 수 있다. 그 다음 코드는 서버로 부터 받아오는 코드이므로 조금 이따가 살펴보고, 이제 서버에서 어떻게 클라이언트에서 보낸 데이터를 처리하는지, 그리고 클라이언트 쪽으로 어떻게 데이터를 보낼 수 있는지 알아보자.
클라이언트에서 데이터 받기
static void Main(string[] args)
{
// (1) 로컬 포트 7000 을 Listen
TcpListener Listener = new TcpListener(IPAddress.Any, 7000);
Listener.Start();
byte[] Buff = new byte[1024];
while (true)
{
Console.WriteLine("Client 연결 대기중 . . .");
TcpClient Client = Listener.AcceptTcpClient();
Console.WriteLine("Client 연결 완료 !");
NetworkStream Stream = Client.GetStream();
int Nbytes;
string ReceiveData = "";
while ((Nbytes = Stream.Read(Buff, 0, Buff.Length)) > 0)
{
ReceiveData = Encoding.ASCII.GetString(Buff,0,Nbytes);
Console.WriteLine("데이터 받는중 : " + ReceiveData + " 남은 데이터 개수 : " + Nbytes);
Stream.Write(Buff, 0, Nbytes);
}
Console.WriteLine("받아온 데이터 : " + ReceiveData);
Stream.Close();
Client.Close();
}
}
Listener 객체를 이용해서 클라이언트의 요청을 받아오고, AcceptTcpClient 함수를 이용해서 Tcp 클라이언트 객체를 가져올 수 있다. 이를 이용해서 네트워크 스트림을 열 수 있고, 이를 통해 클라이언트에서 넘어오는 데이터를 처리할 수 있게된다. 스트림 객체를 이용해서 Read() 함수를 이용하면 데이터를 받아올 수 있으며, byte 의 형태로 데이터는 넘어오기 때문에, Encoding.ASCII.GetString() 와 같은 인코딩 작업이 필요하다. byte 형태의 데이터를 적절한 string 데이터로 변환해주는 작업이다.
여기까지 끝났으면 데이터를 받아오는건 끝났다. 클라이언트에서 데이터를 보냈듯, Write() 함수를 이용해서 서버에서 클라이언트로 데이터를 보낼 수 있다.
이제 클라이언트 쪽 콘솔창과 서버쪽 콘솔창에서 Hello World 라는 문자열을 출력할 수 있음을 보였다.
'네트워크 > 채팅 프로그램' 카테고리의 다른 글
[TCP/IP 소켓 프로그래밍] Winform 을 이용한 채팅 프로그램 - 3 (0) | 2023.10.25 |
---|---|
[TCP/IP 소켓 프로그래밍] Winform 을 이용한 채팅 프로그램 - 2 (0) | 2023.10.23 |
[TCP/IP 소켓 프로그래밍] Winform 을 이용한 채팅 프로그램 - 1 (1) | 2023.10.23 |
[TCP/IP 소켓 프로그래밍] 사용자 입력을 이용한 통신 (2) | 2023.10.17 |