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");

               }

          }

     }

}



* 실행 화면


서버(좌측), 클라이언트(우측) 실행화면




오류나 질문사항은 댓글로 달아주세요!!




to Top