C# 채팅 프로그램(Server 확장)
 


채팅 서버와 클라이언트를 같이 가지고 있는 프로그램이다.

클라이언트와 서버에서 통신을 하기위해서 해당 IP주소와 포트번호를 일치 시켜주어야 한다.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;

namespace ChatServer
{
    public partial class MainForm : Form
    {
        TcpListener Server; // 소켓 서버를 구현하기 위해서
        TcpClient Client;   // 서버+클라이언트기능을 하기위해서

        StreamReader Reader; //스트림 값을 읽어오기 위해서
        StreamWriter Writer; //스트림 값을 쓰기위해서

        NetworkStream stream; //네트워크스트림 연결을 위해서

        Thread ReceiveThread; //멀티쓰레드를 위해서

        bool Connected;  // 연결상태확인

        private delegate void AddTextDelegate(string strText); //Cross-Thread 호출을 실행하기 위해 사용함.

        public MainForm()
        {
            InitializeComponent();
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            Thread ListenThread = new Thread(new ThreadStart(Listen)); //서버를 시작함.
            ListenThread.Start();
        }

        private void SendBtn_Click(object sender, EventArgs e)
        {
            txtMessage.AppendText("이쪽 " + txtSend.Text + "\r\n"); // 이쪽 : 블라블라~
            Writer.WriteLine(txtSend.Text);  //작성한 글을 읽어서 씀 
            Writer.Flush();                  //전송하고 비움.
            txtSend.Clear(); // 글을 작성하는 부분 클리어
        }

        private void MainForm_formClosing(object sender, FormClosedEventArgs 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(txtMessage.AppendText); // 메소드를 등록

            try {

                IPAddress addr = new IPAddress(0); //ip주소
                int port = 8080; //포트

                Server = new TcpListener(addr, port); //서버에 ip주소와 포트가져와서 서버실행

                Server.Start();  // 서버시작

                Invoke(AddText, "서버가 시작되었습니다..." + "\r\n");

                Client = Server.AcceptTcpClient(); //Client 수락

                Connected = true; // 연결됬음을 알리는..

                Invoke(AddText, "클라이언트와 연결되었습니다." + "\r\n");

                stream = Client.GetStream(); // 스트림을 통해서 Client값을 가져오기

                Reader = new StreamReader(stream);  // 스트림값을 읽어드리기
                Writer = new StreamWriter(stream);  // 스트림값을 쓰기

                ReceiveThread = new Thread(new ThreadStart(Receive)); //클래스를 통해서 값을 받는다.
                ReceiveThread.Start(); // 값을 받는 스레드 실행

            
            }
            catch(Exception e)
            {
            
            }
        }

        private void Receive()
        {
            AddTextDelegate AddText = new AddTextDelegate(txtMessage.AppendText); // 메소드 등록

            try
            {

                while (Connected)
                {
                    Thread.Sleep(1); //Windows 시스템은 거의 정확한 sleep 시간을 보장한다. 즉, 1ms에 거의 유사한 sleep 시간을 제공한다.

                    if (stream.CanRead) // 스트림을 읽을 수 있다면...
                    {
                        string tempStr = Reader.ReadLine(); // 값을 일어와서

                        if (tempStr.Length > 0) // 문자 길이가 0이 아니라면
                        {
                            Invoke(AddText, "저쪽: " + tempStr + "\r\n"); // 출력
                            Panel_1.Text = "메시지도착시간: " + DateTime.Now; // 메시지도착시간 출력

                        }


                    }

                }

            }
            catch (Exception e)
            {

            }

        }
    }
}


참고자료
비주얼 C# 2005 익스프레스로 배우는 C# 2.0 프로그래밍 
MSDN http://msdn.microsoft.com/ko-kr/default.aspx 


'1. IT Story > Development' 카테고리의 다른 글

이진찾기  (0) 2012.03.28
피보나치  (0) 2012.03.28
윈도우폰 게임개발 기초(WindowPhoneGame)  (0) 2012.03.07
C# 채팅 프로그램(Client 확장)  (0) 2012.03.07
C# 채팅 프로그램(Client)  (0) 2012.03.07
선택정렬응용  (0) 2012.03.07
이름정렬  (0) 2012.03.07
링크드리스트를 이용한 학생관리Pro  (0) 2012.03.07
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,