본문 바로가기
Programming/C#

[C#] 채팅 프로그램

by NAMP 2013. 3. 24.

 

 

인터넷 소스 참고하면서 채팅 프로그램을 만들어 보았습니다.

 


WpfApplication_chat.7z


WpfApplication_Client.7z


 

뭐, 여러가지 테스트를 거치지 않았으며, 동작되는 것만 확인 한 정도입니다.

 

서버측 소스에서 중점적으로 봐야 할 부분이라면,,,

 

m_threadListen = new Thread(new ThreadStart(listen));

m_threadListen.Start();

스레드를 생성해서 클라이언트의 접속을 기다립니다. 그렇지 않으면 서버가 클라이언트가 올때까지 아무런 일을 할 수 없으니까요.

 

TcpClient client;

client = m_server.AcceptTcpClient();

클라이언트의 접속을 기다립니다.

 

Thread threadReceive = new Thread(new ParameterizedThreadStart(receive));

threadReceive.Start(client);

접속한 클라이언트와의 통신을 위해 스레드를 생성합니다.

이때 접속한 클라이언트의 정보를 전달하기 위해서 ParameterizedThreadStart 를 사용합니다.

public void receive(object p_client)

해당 스레드에서 파라미터를 받을 때에는 object 타입으로 받아야 하더라구요.

 

if (stream.CanRead)

{

String clientMsg = reader.ReadLine();

}

스트림을 읽을 수 있는지 확인한 후에, ReadLine() 을 통해서 받은 메시지를 읽습니다.

 

foreach (TcpClient client in m_clients)

{

StreamWriter writer = new StreamWriter(client.GetStream());

writer.WriteLine(sendingMsg);

writer.Flush();

}

서버에서 모든 클라이언트에 메시지를 보내기 위해서 저장해놓은 클라이언트 정보를 이용해서 메시지를 보냅니다. WriteLine()을 통해서 보냅니다. Write() 함수를 쓰니 전송이 안되더라구요. '\n'을 붙이면 됬을까요?

 


서버소스


 

 

 

 

클라이언트측 소스에서 볼 부분은

 

m_client.Connect(ip, port);

Connect 함수를 통해서 서버에 접속합니다. IP, Port 는 미리 알고 있어야 겠죠.

 

Thread threadReceive = new Thread(new ParameterizedThreadStart(receive));

threadReceive.Start(m_client);

서버측 메시지를 받기위한 스레드를 생성합니다.

 

private delegate void INVOKE_BTN(Boolean canConnect);

 

private void changeChatBtnsCanConnect(Boolean canConnect)

{

INVOKE_BTN invokeChangeBtn = new INVOKE_BTN(changeChatBtns);

this.Dispatcher.Invoke(invokeChangeBtn, canConnect);

}

 

 

private void changeChatBtns(bool canConnect)

{

btnConnect.IsEnabled = canConnect;

btnSend.IsEnabled = !canConnect;

}

주 스레드가 아닌 스레드에서 UI 변경을 위해 INVOKE 를 사용합니다.

 

서버측과 동일하게 ReadLine() / WriteLine() 을 통해서 통신을 하면 됩니다.

 

 

클라이언트 소스


 

 

 

 

 

 

댓글