이번 강좌에서는 C#기반의 콘솔 채팅 Application을 만들어 보겠습니다. 윈도우 기반의 채팅 보다는 소스가 간결하니 따라해 보세요~ 뒤에 나오는 윈도우 기반의 채팅을 만들기 전에 해보시는게 좋구요~ 이전의 소켓 프로그래밍을 이해 하는데 도음이 될겁니다.
----------------------
콘솔 기반의 채팅 프로그램
----------------------
MultiThread 기반의 Client/Server 프로그램과 비슷하나 서버의 경우 Client의 접속을 ArrayList에 보관한 후 Echo를 현재 접속 한 모든 클라이언트에 한다는 점이 다르니 유심히 보기 바라며 한글 처리 부분 또한 확인 바랍니다. 우선 실행 화면을 보시면 아래와 같습니다.
[서버]
[클라이언트]
소스코드는 아래와 같습니다. 그리 길지 않으니 차분히 실습해 보시기를 바랍니다.
[서버 - Server.cs]
using System;
using System.IO;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Collections;
public class ClientHandler
{
public Socket clientSocket;
public void runClient()
{
NetworkStream stream = null ;
StreamReader reader = null ;
try
{
Encoding encode = Encoding.GetEncoding("KS_C_5601-1987");
EchoServer.socketList.Add(clientSocket);
stream = new NetworkStream(clientSocket);
reader = new StreamReader(stream, encode);
while ( true )
{
string str = reader.ReadLine();
if (str.IndexOf("")>-1)
{
Console.WriteLine("Bye Bye");
break ;
}
Console.WriteLine(str);
str += "\r\n";
/*
byte[] dataWrite = Encoding.Default.GetBytes(str);
stream.Write(dataWrite, 0, dataWrite.Length);
*/
foreach (Socket sock in EchoServer.socketList)
{
NetworkStream streamtemp = new NetworkStream(sock);
byte [] dataWrite = Encoding.Default.GetBytes(str);
streamtemp.Write(dataWrite, 0, dataWrite.Length);
}
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString() );
}
finally
{
EchoServer.socketList.Remove(clientSocket);
clientSocket.Close();
}
}
}
public class EchoServer
{
static public ArrayList socketList = new ArrayList();
static void Main ( string [] args)
{
TcpListener tcpListener = null ;
try
{
IPAddress ipAd = IPAddress.Parse("127.0.0.1");
tcpListener = new TcpListener(ipAd, 5001);
tcpListener.Start();
Console.WriteLine("[Server]Chatting Server is start... \n[Server]Waiting for connections...");
while ( true )
{
Socket client = tcpListener.AcceptSocket();
ClientHandler cHandler = new ClientHandler();
cHandler.clientSocket = client;
Thread clientThread = new Thread( new ThreadStart(cHandler.runClient));
clientThread.Start();
}
}
catch (Exception exp)
{
Console.WriteLine("Exception:" + exp);
}
finally
{
tcpListener.Stop();
}
}
}
[Client – Client.cs]
using System;
using System.IO;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
public class ClientHandler
{
public StreamReader readerStream;
//쓰레드에서 처리 할 부분
//계속 값을 읽어 서버에서 부내는 값이 있으면 화면에 출력
//계속 대기해야 하므로 쓰레드로 처리
public void runClient()
{
try
{
while ( true )
{
string returnData;
returnData = readerStream.ReadLine();
Console.WriteLine("Server: " + returnData);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString() );
}
}
}
class TcpClientTest
{
static void Main ( string [] args)
{
TcpClient client = null ;
try
{
//한글 처리를 위한 인코딩
Encoding encode = Encoding.GetEncoding("KS_C_5601-1987");
//TcpClient를 이용하여 서버의 5001번 포트로 접속
client = new TcpClient();
client.Connect("localhost", 5001);
NetworkStream stream = client.GetStream();
StreamReader readerStream = new StreamReader(stream, encode);
string sendstr = null ;
byte [] senddata = new byte [200];
ClientHandler cHandler = new ClientHandler();
//서버로 부터 날아오는 메시지 처리를 위한 쓰레드를 생성
//계속 대기해야 하므로 쓰레드로 처리
Thread clientThread = new Thread( new ThreadStart(cHandler.runClient));
clientThread.Start();
cHandler.readerStream = readerStream;
while ( true )
{
//화면에서 사용자가 입력하는 값을 서버로 전송
sendstr = Console.ReadLine();
sendstr += "\r\n";
senddata = Encoding.Default.GetBytes(sendstr);
stream.Write(senddata, 0, senddata.Length);
if (sendstr.IndexOf("")>-1) break ;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString() );
}
finally
{
client.Close();
}
}
}
댓글 없음:
댓글 쓰기