[TCP/IP] C# 소켓 프로그래밍 - 채팅 프로그램 만들기
TCP/IP 는 패킷 통신 방식으로 IP(인터넷 프로토콜)와 TCP(전송제어 프로토콜)로 구성되어있습니다.
이번에는 C#으로 TCP/IP 통신 프로그램을 이용하여 간단한 채팅프로그램을 만들어보겠습니다.
* 개발 환경
개발 툴 : Visual Studio 15.0(2017)
개발 언어 : C#
* 소스 코드(서버)
TcpListener Server; // 소켓 서버
TcpClient Client; // 클라이언트
StreamReader Reader;
StreamWriter Writer;
NetworkStream stream; // 네트워크 스트림 연결
Thread ReceiveThread;
bool Connected;
private delegate void AddTextDelegate(string strText); // 크로스 쓰레드 호출
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Thread ListenThread = new Thread(new ThreadStart(Listen)); // 서버 시작
ListenThread.Start();
}
private void button1_Click(object sender, EventArgs e) // 보내기 버튼
{
textBox1.AppendText("Me : " + textBox2.Text + "\r\n"); // 화면에 출력
Writer.WriteLine(textBox2.Text); // 보내버리기
Writer.Flush();
textBox2.Clear();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e) // 폼 종료
{
Connected = false;
if (Reader != null) Reader.Close();
if (Writer != null) Writer.Close();
if (Server != null) Server.Stop();
if (Client != null) Client.Close();
if (ReceiveThread != null) ReceiveThread.Abort(); // 사용한 객체를 모두 닫아준다
}
private void Listen() // 클라이언트와 연결하기
{
AddTextDelegate AddText = new AddTextDelegate(textBox1.AppendText);
IPAddress addr = new IPAddress(0); // 서버 ip
int port = 8080; // 서버 포트
Server = new TcpListener(addr, port);
Server.Start(); // 서버 시작
Invoke(AddText, "Server Start!" + "\r\n");
Client = Server.AcceptTcpClient(); // 클라이언트 연결 수락
Connected = true;
Invoke(AddText, "Connected to Client!" + "\r\n");
stream = Client.GetStream(); // 클라이언트 스트림 값 받아오기
Reader = new StreamReader(stream);
Writer = new StreamWriter(stream);
ReceiveThread = new Thread(new ThreadStart(Receive)); // 값을 받기 위한 쓰레드
ReceiveThread.Start();
}
private void Receive() // 클라이언트에게 받기
{
AddTextDelegate AddText = new AddTextDelegate(textBox1.AppendText);
while(Connected)
{
Thread.Sleep(1);
if(stream.CanRead) // 받아온 데이터가 있다면 출력
{
string tempStr = Reader.ReadLine();
if(tempStr.Length > 0)
{
Invoke(AddText, "You : " + tempStr + "\r\n");
}
}
}
}
* 소스 코드(클라이언트) - 서버와 거의 비슷함
TcpListener Server;
TcpClient Client;
StreamReader Reader;
StreamWriter Writer;
NetworkStream stream;
Thread ReceiveThread;
bool Connected;
private delegate void AddTextDelegate(string strText);
public Form1()
{
InitializeComponent();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e) // 폼 종료
{
Connected = false;
if (Reader != null) Reader.Close();
if (Writer != null) Writer.Close();
if (Server != null) Server.Stop();
if (Client != null) Client.Close();
if (ReceiveThread != null) ReceiveThread.Abort();
}
private void button1_Click(object sender, EventArgs e) // 보내기 버튼
{
textBox1.AppendText("Me : " + textBox2.Text + "\r\n");
Writer.WriteLine(textBox2.Text); // 보내버리기
Writer.Flush();
textBox2.Clear();
}
private void Form1_Load(object sender, EventArgs e) // 폼 실행
{
String IP = "192.168.x.x"; // 접속 할 서버 아이피를 입력
int port = 8080; // 포트
Client = new TcpClient();
Client.Connect(IP, port);
stream = Client.GetStream();
Connected = true;
textBox1.AppendText("Connected to Server!" + "\r\n");
Reader = new StreamReader(stream);
Writer = new StreamWriter(stream);
ReceiveThread = new Thread(new ThreadStart(Receive));
ReceiveThread.Start();
}
private void Receive() // 서버로 부터 값 받아오기
{
AddTextDelegate AddText = new AddTextDelegate(textBox1.AppendText);
while (Connected)
{
Thread.Sleep(1);
if (stream.CanRead)
{
string tempStr = Reader.ReadLine();
if (tempStr.Length > 0)
{
Invoke(AddText, "You : " + tempStr + "\r\n");
}
}
}
}
* 실행 화면
서버(좌측), 클라이언트(우측) 실행화면
오류나 질문사항은 댓글로 달아주세요!!
'Program Development' 카테고리의 다른 글
C# 소켓 프로그래밍 - 비동기 채팅 프로그램 만들기 (1:n 통신) (13) | 2018.08.31 |
---|---|
[C#] 자동차 번호판 인식 프로그램 with Tesseract-OCR, OpenALPR (27) | 2018.08.22 |
C# 바코드 인식 프로그램 (9) | 2018.08.18 |