블로그 이미지
따시쿵

calendar

1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

Notice

'c# chat'에 해당되는 글 1

  1. 2015.03.17 [Program C#] 서버-클라이언트 채팅 통신
2015. 3. 17. 15:41 C# with TCP/IP

프로그램 설명




실행 후




Connect 버튼 클릭 후




메시지 전송 후




프로그램 작성


1. handleClient.cs (서버에서 사용하는 클래스)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
class handleClient
{
    TcpClient clientSocket = null;
    public Dictionary<Tcpclient, string> clientList = null;
 
    public void startClient(TcpClient clientSocket, Dictionary<Tcpclient, string> clientList)
    {
        this.clientSocket = clientSocket;
        this.clientList = clientList;
 
        Thread t_hanlder = new Thread(doChat);
        t_hanlder.IsBackground = true;
        t_hanlder.Start();
    }
 
    public delegate void MessageDisplayHandler(string message, string user_name);
    public event MessageDisplayHandler OnReceived;
 
    public delegate void DisconnectedHandler(TcpClient clientSocket);
    public event DisconnectedHandler OnDisconnected;
 
    private void doChat()
    {
        NetworkStream stream = null;
        try
        {
            byte[] buffer = new byte[1024];
            string msg = string.Empty;
            int bytes = 0;
            int MessageCount = 0;
 
            while (true)
            {
                MessageCount++;
                stream = clientSocket.GetStream();
                bytes = stream.Read(buffer, 0, buffer.Length);
                msg = Encoding.Unicode.GetString(buffer, 0, bytes);
                msg = msg.Substring(0, msg.IndexOf("$"));
 
                if (OnReceived != null)
                    OnReceived(msg, clientList[clientSocket].ToString());
            }
        }
        catch (SocketException se)
        {
            Trace.WriteLine(string.Format("doChat - SocketException : {0}", se.Message));
 
            if (clientSocket != null)
            {
                if (OnDisconnected != null)
                    OnDisconnected(clientSocket);
 
                clientSocket.Close();
                stream.Close();
            }
        }
        catch (Exception ex)
        {
            Trace.WriteLine(string.Format("doChat - Exception : {0}", ex.Message));
 
            if (clientSocket != null)
            {
                if (OnDisconnected != null)
                    OnDisconnected(clientSocket);
 
                clientSocket.Close();
                stream.Close();
            }
        }
    }
 
}


2. 서버 프로그램


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
public partial class MainForm : Form
{
    TcpListener server = null;
    TcpClient clientSocket = null;
    static int counter = 0;
 
    public Dictionary<Tcpclient, string> clientList = new Dictionary<Tcpclient,string>();
 
    public MainForm()
    {
        InitializeComponent();
 
        // socket start
        Thread t = new Thread(InitSocket);
        t.IsBackground = true;
        t.Start();
    }
 
    private void InitSocket()
    {
        server = new TcpListener(IPAddress.Any, 9999);
        clientSocket = default(TcpClient);
        server.Start();
        DisplayText(">> Server Started");
 
        while(true)
        {
            try
            {
                counter++;
                clientSocket = server.AcceptTcpClient();
                DisplayText(">> Accept connection from client");
 
                NetworkStream stream = clientSocket.GetStream();
                byte[] buffer = new byte[1024];
                int bytes = stream.Read(buffer, 0, buffer.Length);
                string user_name = Encoding.Unicode.GetString(buffer, 0, bytes);
                user_name = user_name.Substring(0, user_name.IndexOf("$"));
 
                clientList.Add(clientSocket, user_name);
 
                // send message all user
                SendMessageAll(user_name + " Joined ", ""false);
 
                handleClient h_client = new handleClient();
                h_client.OnReceived += new handleClient.MessageDisplayHandler(OnReceived);
                h_client.OnDisconnected += new handleClient.DisconnectedHandler(h_client_OnDisconnected);                   
                h_client.startClient(clientSocket, clientList);
            }
            catch (SocketException se)
            {
                Trace.WriteLine(string.Format("InitSocket - SocketException : {0}", se.Message));
                break;
            }
            catch (Exception ex)
            {
                Trace.WriteLine(string.Format("InitSocket - Exception : {0}", ex.Message));
                break;
            }
        }
 
        clientSocket.Close();
        server.Stop();
    }
 
    void h_client_OnDisconnected(TcpClient clientSocket)
    {
        if (clientList.ContainsKey(clientSocket))
            clientList.Remove(clientSocket);
    }
 
    private void OnReceived(string message, string user_name)
    {
        string displayMessage = "From client : " + user_name + " : " + message;
        DisplayText(displayMessage);
        SendMessageAll(message, user_name, true);
    }
 
    public void SendMessageAll(string message, string user_name, bool flag)
    {
        foreach(var pair in clientList)
        {
            Trace.WriteLine(string.Format("tcpclient : {0} user_name : {1}", pair.Key, pair.Value));
 
            TcpClient client = pair.Key as TcpClient;
            NetworkStream stream = client.GetStream();
            byte[] buffer = null;
 
            if(flag)
            {
                buffer = Encoding.Unicode.GetBytes(user_name + " says : " + message);
            }
            else
            {
                buffer = Encoding.Unicode.GetBytes(message);
            }
             
            stream.Write(buffer, 0, buffer.Length);
            stream.Flush();
        }
    }
 
    private void DisplayText(string text)
    {
        if (richTextBox1.InvokeRequired)
        {
            richTextBox1.BeginInvoke(new MethodInvoker(delegate
            {
                richTextBox1.AppendText(text + Environment.NewLine);
            }));
        }
        else
            richTextBox1.AppendText(text + Environment.NewLine);
    }
}


3. 클라이언트 프로그램


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
public partial class MainForm : Form
{
    TcpClient clientSocket = new TcpClient();
    NetworkStream stream = default(NetworkStream);
    string message = string.Empty;
 
    public MainForm()
    {
        InitializeComponent();
    }
 
    private void btnSendText_Click(object sender, EventArgs e)
    {
        byte[] buffer = Encoding.Unicode.GetBytes(this.textBoxMessage.Text + "$");
        stream.Write(buffer, 0, buffer.Length);
        stream.Flush();
    }
 
    private void btnConnect_Click(object sender, EventArgs e)
    {
        clientSocket.Connect("192.168.0.12", 9999);
        stream = clientSocket.GetStream();
 
        message = "Connected to Chat Server";
        DisplayText(message);
 
        byte[] buffer = Encoding.Unicode.GetBytes(this.textBoxNickName.Text + "$");
        stream.Write(buffer, 0, buffer.Length);
        stream.Flush();
 
        Thread t_handler = new Thread(GetMessage);
        t_handler.IsBackground = true;
        t_handler.Start();
    }
 
    private void GetMessage()
    {
        while(true)
        {
            stream = clientSocket.GetStream();
            int BUFFERSIZE = clientSocket.ReceiveBufferSize;
            byte[] buffer = new byte[BUFFERSIZE];
            int bytes = stream.Read(buffer, 0, buffer.Length);
 
            string message = Encoding.Unicode.GetString(buffer, 0, bytes);
            DisplayText(message);
        }
    }
 
    private void DisplayText(string text)
    {
        if (richTextBox1.InvokeRequired)
        {
            richTextBox1.BeginInvoke(new MethodInvoker(delegate
            {
                richTextBox1.AppendText(text + Environment.NewLine);
            }));
        }
        else
            richTextBox1.AppendText(text + Environment.NewLine);
    }
}


posted by 따시쿵
prev 1 next