이번 강좌에서는 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();
}
}
}
오라클자바커뮤니티에서 운영, 개발자 전문교육, 개인80%환급
오엔제이프로그래밍실무교육센터(www.onjprogramming.co.kr)
평일주간(9:30~18:30) 개강
(3/25)C#4.0,ADO.NET,Network 프로그래밍
(3/31)[기업100%환급]PL/SQL,ORACLE HINT,TUNING
(3/31)[기업100%환급]Spring ,MyBatis,Hibernate실무과정
(4/07)[기업100%환급]SQL기초에서 Schema Object까지
(4/07)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
평일야간(19:00~22:00) 개강
(3/27)Spring3.X, MyBatis, Hibernate실무과정
(3/27)웹퍼블리싱 마스터
(3/27)SQL초보에서실전전문가까지
(3/28)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(3/28)C#,ASP.NET마스터
(4/01)안드로이드개발자과정
(4/07)[실무프로젝트형과정]자바웹(JSP,Spring,MyBatis,XPlatform)프로젝트과정
주말(10:00~18:00) 개강
(3/29)C#,ASP.NET마스터
(3/29)안드로이드개발자과정
(3/29)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(3/29)Spring3.X, MyBatis, Hibernate실무과정
(3/29)웹퍼블리싱 마스터
(3/29)SQL초보에서실전전문가까지
(4/05)닷넷실무자를위한WPF개발자과정
주말저녁(18:30~22:20) 개강
(3/29)자바기초에서JSP,Servlet,Ajax,jQUERY,스프링,마이바티스,하이버네이트
(3/29)SQL기초에서 Schema Object까지
오엔제이프로그래밍실무교육센터(www.onjprogramming.co.kr)
평일주간(9:30~18:30) 개강
(3/25)C#4.0,ADO.NET,Network 프로그래밍
(3/31)[기업100%환급]PL/SQL,ORACLE HINT,TUNING
(3/31)[기업100%환급]Spring ,MyBatis,Hibernate실무과정
(4/07)[기업100%환급]SQL기초에서 Schema Object까지
(4/07)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
평일야간(19:00~22:00) 개강
(3/27)Spring3.X, MyBatis, Hibernate실무과정
(3/27)웹퍼블리싱 마스터
(3/27)SQL초보에서실전전문가까지
(3/28)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(3/28)C#,ASP.NET마스터
(4/01)안드로이드개발자과정
(4/07)[실무프로젝트형과정]자바웹(JSP,Spring,MyBatis,XPlatform)프로젝트과정
주말(10:00~18:00) 개강
(3/29)C#,ASP.NET마스터
(3/29)안드로이드개발자과정
(3/29)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(3/29)Spring3.X, MyBatis, Hibernate실무과정
(3/29)웹퍼블리싱 마스터
(3/29)SQL초보에서실전전문가까지
(4/05)닷넷실무자를위한WPF개발자과정
주말저녁(18:30~22:20) 개강
(3/29)자바기초에서JSP,Servlet,Ajax,jQUERY,스프링,마이바티스,하이버네이트
(3/29)SQL기초에서 Schema Object까지
댓글 없음:
댓글 쓰기