Project History/다중 기능을 포함한 채팅 프로그램

[C# 채팅 프로그램 #02] IOCP - EAP 패턴을 이용한 비동기 TCP/IP 클라이언트 구현 (SocketAsyncEventArgs)

JeongKyun 2022. 2. 10.
반응형

이전 글에서 서버를 구현하는 것을 알아 보았고 이번 글에서는 클라이언트에 대해 알아 볼 것이다.

클라이언트에서도 서버와 동일하게 SocketAsyncEventArgs 클래스를 사용했으며 구현 소스를 통해 알아보자.

 

 

1. 서버 연결 

client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(IPAddress.Parse(tb_server_ip.Text), int.Parse(tb_server_port.Text));
JObject data = new JObject();

data.Add("type", "init");
data.Add("text", tb_userid.Text);

// json -> string parsing
string make_data = JsonConvert.SerializeObject(data);

// string -> byte[] parsing (utf8)
byte[] byte_data = Encoding.UTF8.GetBytes(make_data);

client.Send(byte_data);
SocketAsyncEventArgs receiveAsync = new SocketAsyncEventArgs();
receiveAsync.Completed += new EventHandler<SocketAsyncEventArgs>(receiveAsync_Completed);
receiveAsync.SetBuffer(new byte[4], 0, 4);
receiveAsync.UserToken = client;
client.ReceiveAsync(receiveAsync);

클라이언트에서 서버에 연결하는 방법은 다음과 같다. 우선 Socket을 만들어주고

Connect 함수의 파라미터에 접속할 서버의 IP와 Port를 입력해준다.

 

그 다음  JOject를 이용하여 key값으로 "type"에서 "init"을 써주었고 아래 "text"에는 보낼 메세지를 담는식으로 작업했다.

 

채팅 프로그램에서 필자가 사용할 type의 구분은 이렇게 구분지었다.

Type key 종류
1. init
-> 처음 연결했을 때만 init으로 보내어 서버에서는 init으로 받았을 경우 접속한 사용자의 이름 저장한다.
2. op
-> 첫 서버 연결(init)이 끝난 후 이후에 채팅 메세지들을 보낼 때 사용한다.

 

그러하여 처음 연결 시 type에 init을 이용하여 사용자 이름을 json 형식으로 만든 후 해당 소켓으로 Send하는 방식을 이용했다. 아래의 SocketAsyncEventArgs 과정은 이전 글과 동일하기에 참고하면 될 것같다.

 

 

 

2. 서버에게 메세지 보내기

JObject data = new JObject();

data.Add("type", "op");
data.Add("text", rtb_send_Text.Text);

// json -> string parsing
string make_data = JsonConvert.SerializeObject(data);
// string -> byte[] parsing (utf8)
byte[] send_text = Encoding.UTF8.GetBytes(make_data);
// server send
client.Send(send_text);

위와 같은 방식으로 json 형식을 byte[]로 변환하여 서버에게 메세지를 보내는 방식으로 진행하였다.

 

이렇게 보니 서버보단 클라이언트는 확실히 그냥 연결후 데이터 가공하여 보내면 되는 방식이라 뭐 없는 것 같다.

 

하지만 아직 암복호화 작업은 아직 안되었기에 이후에 작업 후에 다시 수정을 할 예정이다.

 

 

댓글

💲 많이 본 글