반응형
목표

- 여러개의 클라이언트 동작 상태를 확인합니다.

- 통신을 중계하는 서버의 역할과 클라이언트의 역할을 확인합니다.

 

폼구성

 

 

소스코드

 

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace ChatClient
{
    public partial class Form1 : Form
    {
        TcpClient clientSocket; // 소켓
        NetworkStream stream = default(NetworkStream);
        string stSendMessage = "";
        // 메시지는 개행으로 구분한다.
        private static char CR = (char)0x0D;
        private static char LF = (char)0x0A;
        bool bThreadExit = false;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void btn_Login_Click(object sender, EventArgs e)
        {
            bThreadExit = false;
            int Port = Int32.Parse(txt_Port.Text);
            clientSocket = new TcpClient();
            stream = default(NetworkStream);
            try
            {
                clientSocket.Connect(txt_ServerIP.Text, Port); // 접속 IP 및 포트
                stream = clientSocket.GetStream();
            }
            catch (Exception e2)
            {
                MessageBox.Show("서버가 실행중이 아닙니다.""연결 실패!");
                return;
            }
            btn_Login.Enabled = false;
            txt_user.Enabled = false;
 
            byte[] buffer = Encoding.Unicode.GetBytes("Login$"+ txt_user.Text + CR + LF);
            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 (!bThreadExit)
            {
                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 message)
        {
            if (rt_Message.InvokeRequired) //다른 쓰레드에서 실행되어 Invoke가 필요한 상태라면 
            {
                rt_Message.BeginInvoke(new MethodInvoker(delegate   ///델리게이트로 넘겨서 실행
                {
                    rt_Message.AppendText(message + Environment.NewLine);
                }));
            }
            else
                rt_Message.AppendText(message + Environment.NewLine);
        }
 
        private void btn_Logout_Click(object sender, EventArgs e)
        {
            
            byte[] buffer = Encoding.Unicode.GetBytes("exit" + CR + LF);
            stream.Write(buffer, 0, buffer.Length);
            stream.Flush();
            bThreadExit = true;
            Thread.Sleep(1000);            
 
            Application.Exit();
            
        }
 
        private void btn_Send_Click(object sender, EventArgs e)
        {
            byte[] buffer = Encoding.Unicode.GetBytes(txt_user.Text + "$" + txt_message.Text + CR + LF);
            stream.Write(buffer, 0, buffer.Length);
            stream.Flush();
            txt_message.Text = "";
        }
 
        private void txt_message_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btn_Send_Click(sender, e);
        }
    }
}
 
cs

 

동작

 

클라이언트에서 메시지를 보내면 서버에서 중계 역할을 하여 현재 접속되어 있는 클라이언트에 같은 메시지를 모두 전송

ChatClient.zip
0.04MB
MultiChatServer.zip
0.06MB

활용

네트워크를 활용한 응용 프로그램 구현

 

 

=====================================================

이 자료는 학생들과 특강시간에 만들어 보는 프로그램입니다.

=====================================================

 

오늘도 최선을 다하는 우리 학생들을 응원합니다.

인천 서구 검단신도시 원당컴퓨터학원

 

 

원당컴퓨터학원에서는?

1. 4차 산업 시대의 흐름은 컴퓨터를 얼마나 이해하느냐에 따라 삶의 질이 틀려 질 수 있다는 것을 항상 염두에 두고 있습니다.

2. 알고리즘은 프로그래밍의 근원이 되는 문제해결 능력이며, 머신러닝은 IoT등에 의해 모여진 데이터를 활용하는 기법입니다.

3. 이에 따라 초,중,고 학생들이 알기 쉽게 이해하는 인공지능 부터 알고리즘까지 학생들의 실력에 맞춰 수업을 진행중에 있습니다.

4. 현재 초등학생이 고등학생이 되는 때에는 고교학점제 도입에 따라 자신이 전공하고자 하는 특기가 크게 부각 될것입니다.

5. IT 업체중 규모가 큰 곳에서는 코딩테스트(알고리즘테스트)로 블라인드 면접을 수행하는곳이 늘고 있습니다.

6. 미래 IT를 꿈꾸는 학생들의 산실이 되기 위해 항상 최선을 다하는 원당컴퓨터학원이 되겠습니다.

 

※ 정보영재 혹은 인공지능 관련 수업에 관해 궁금하신 분은 문의(032-565-5497) 주세요.

 

 

원당컴퓨터학원 커리큘럼

- OA : 학교 수행 평가에 꼭 필요한 컴퓨터 활용능력 향상

- IT 자격증 과정 : 취업대비,대학생인증제,승진을 위한 국가공인 자격증 취득과정

- 정보영재 : 정보올림피아드 및 알고리즘 대회/소프트웨어특기자전형/디미고 특별전형 대비/코딩테스트 대비를 위한 알고리즘 과정

- 프로젝트반 : 응용프로그래밍/웹프로그래밍/앱프로그래밍 등을 통해 직접 만들어 보면서 컴퓨터 프로그래밍 이해(소프트웨어 학생부종합전형/특성화고(디미고,선린고등) 특별전형대비)

- 인공지능 : 인공지능의 이해 및 실습을 통해 빅데이터 가공(4차 산업 시대의 축이 되는 인공지능 시대를 대비)

- 과고,영재고,컴퓨터학과(SW) 대학생을 위한 내신대비 : python,java,c++,자료구조,알고리즘 

반응형
사업자 정보 표시
원당컴퓨터학원 | 기희경 | 인천 서구 당하동 1028-2 장원프라자 502호 | 사업자 등록번호 : 301-96-83080 | TEL : 032-565-5497 | Mail : icon001@naver.com | 사이버몰의 이용약관 바로가기
Posted by 파아란기쁨 트랙백 0 : 댓글 10

댓글을 달아 주세요

  1. addr | edit/del | reply 핑구야날자 2021.04.03 07:59

    덕분에 c#을 배우고 싶다는 생각이 드네요

  2. addr | edit/del | reply 휴식같은 친구 2021.04.03 22:05 신고

    채팅소스를 공유해 주셨군요.
    필요한 분들에게 큰 도움이 되겠습니다.

  3. addr | edit/del | reply 데보라 2021.04.03 23:02

    오 새로운 것 하나 배웠습니다.

  4. addr | edit/del | reply 청결원 2021.04.04 06:54

    포스팅 잘 보고 갑니다
    휴일 잘 보내세요~

  5. addr | edit/del | reply *저녁노을* 2021.04.04 07:17 신고

    노을인 어려워요.ㅎㅎ

  6. addr | edit/del | reply 라드온 2021.04.04 19:13 신고

    멀티채팅프로그램만들기 재밌겠는데요?!

  7. addr | edit/del | reply 2021.04.04 19:56

    비밀댓글입니다

  8. addr | edit/del | reply 가족바라기 2021.04.04 20:44 신고

    어렵지만 새로운것 배울수 있어 좋네요

  9. addr | edit/del | reply 空空(공공) 2021.04.05 08:02 신고

    소스 필요하신 분들 도움이 되실듯 합니다

  10. addr | edit/del | reply 드래곤포토 2021.04.05 18:53 신고

    저도 프로그래머출신이지만 C#이 있는 건 처음알고 갑니다.
    새로운 언어가 생기네요