Microsoft PowerPoint - 09-EDU-15-채팅 프로그래밍

Similar documents
Microsoft PowerPoint - CSharp-15-채팅

Microsoft PowerPoint - 04-UDP Programming.ppt

3ÆÄÆ®-11

Microsoft PowerPoint - CSharp-10-예외처리

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft PowerPoint - 09-CE-24-채팅 프로그램

Microsoft PowerPoint - Lecture_Note_5.ppt [Compatibility Mode]

Microsoft PowerPoint - Supplement-03-TCP Programming.ppt [호환 모드]

Windows 8에서 BioStar 1 설치하기

2009년 상반기 사업계획

Microsoft PowerPoint - 03-TCP Programming.ppt

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to TCP/IP Sockets: C Version

PowerPoint 프레젠테이션

<4D F736F F F696E74202D E20B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D62E >

PowerPoint Presentation

Microsoft PowerPoint PythonGUI-socket

Visual Basic 반복문

PowerPoint Template

PowerPoint Presentation

Microsoft Word - src.doc

API - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어

<4D F736F F F696E74202D20B3D7C6AEBFF6C5A9C7C1B7CEB1D7B7A1B9D65F FBCD2C4CF5FC3A4C6C35FBFA1C4DA2E BC8A3C8A

컴퓨터네트워크

윈도우시스템프로그래밍

3ÆÄÆ®-14

윈도우즈프로그래밍(1)

PowerPoint Presentation

<4D F736F F F696E74202D20C1A63235C0E520B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D628B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

컴퓨터네트워크

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

var answer = confirm(" 확인이나취소를누르세요."); // 확인창은사용자의의사를묻는데사용합니다. if(answer == true){ document.write(" 확인을눌렀습니다."); else { document.write(" 취소를눌렀습니다.");

학습목표 텍스트파일을다룰수있다. 스트림읽기, 쓰기를안다. 2

C++ Programming

PowerPoint 프레젠테이션

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

Microsoft PowerPoint - CSharp-2-기초문법

The Pocket Guide to TCP/IP Sockets: C Version

어댑터뷰

PowerPoint Presentation

Microsoft PowerPoint - C++ 5 .pptx

Microsoft Word - Crackme 15 from Simples 문제 풀이_by JohnGang.docx

PowerPoint 프레젠테이션

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

슬라이드 1

제11장 프로세스와 쓰레드

본 강의에 들어가기 전

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

슬라이드 1

bn2019_2

제1장 Unix란 무엇인가?

제 1장 C#의 개요

<4D F736F F F696E74202D20B5A5C0CCC5CDBAA3C0CCBDBA5F3130C1D6C2F75F32C2F7BDC32E >

JAVA PROGRAMMING 실습 08.다형성

게시판 스팸 실시간 차단 시스템

Microsoft PowerPoint - 09-CE-5-윈도우 핸들

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

JMF3_심빈구.PDF

윈도우시스템프로그래밍

PowerPoint 프레젠테이션

자바-11장N'1-502

슬라이드 1

학습목표 배열에대해서안다. 언어통합질의 (LINQ) 에대해서안다. 2

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

목차 윈도우드라이버 1. 매뉴얼안내 운영체제 (OS) 환경 윈도우드라이버준비 윈도우드라이버설치 Windows XP/Server 2003 에서설치 Serial 또는 Parallel 포트의경우.

chap 5: Trees

BMP 파일 처리

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

Visual Basic 기본컨트롤

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

PowerPoint Presentation

Æí¶÷4-¼Ö·ç¼Çc03ÖÁ¾š

슬라이드 1

Analytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Cras

PowerPoint 프레젠테이션

4 장클래스와객체 클래스와객체 public과 private 구조체와클래스객체의생성과생성자객체의소멸과소멸자생성자와소멸자의호출순서디폴트생성자와디폴트소멸자멤버초기화멤버함수의외부정의멤버함수의인라인함수선언 C++ 프로그래밍입문

vi 사용법

Microsoft PowerPoint - 13 ¼ÒÄÏÀ» ÀÌ¿ëÇÑ Åë½Å 2.ppt

Microsoft PowerPoint - [EEL2] Lab10.pptx

Microsoft PowerPoint - 2-Objective-C 기초

유니티 변수-함수.key

본 강의에 들어가기 전

학습목표 네트워크개요 TCP PORT URL/InetAddress Socket/TCP 을이용한네트워크 2

Cluster management software

(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345])

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

Microsoft PowerPoint - Java7.pptx

슬라이드 1

JAVA PROGRAMMING 실습 05. 객체의 활용

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

C# 입문 : 이론과 실습

PowerPoint Template

슬라이드 1

[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

쉽게 풀어쓴 C 프로그래밍

gnu-lee-oop-kor-lec10-1-chap10

C프로-3장c03逞풚

Transcription:

15. 채팅프로그램 순천향대학교컴퓨터학부이상정 1 학습내용 사용자인터페이스 프로그램구성 TCP 연결설정프로그램 서버연결설정 클라이언트연결설정 TCP 데이터송수신 순천향대학교컴퓨터학부이상정 2

사용자인터페이스, Form 클래스 순천향대학교컴퓨터학부이상정 3 1:1 채팅프로그램 한프로그램이동시에서버와클라이언트로동작 프로그램시작시서버로동작 서버소켓생성하고상대방접속요청대기 채팅을위한연결요청시클라이언트로동작 다른쪽은상대방이열어놓은서버소켓에접속 Network 클래스를추가하여통신처리를전담 프로젝트이름 : MainChat 컨트롤을배치하고속성을설정 순천향대학교정보기술공학부이상정 IP 네트워크 4

실행결과 순천향대학교컴퓨터학부이상정 5 실행결과 순천향대학교컴퓨터학부이상정 6

사용자인터페이스 컨트롤을배치하고속성을설정 컨트롤속성값 Name Form1 Form Text 1:1 채팅프로그램 Ver 1.0 FormBorderStyle FixedSingle TextBox Name txt_ ip Button Name btn_connect Text 연결 Name txt_info TextBox Multiline True ReadOnly True TextBox Name txt_input 순천향대학교컴퓨터학부이상정 7 Form1.cs: 네임스페이스, 변수추가 Form1.cs 소스파일열고 (Form 선택후더블클릭 ) 네임스페이스와멤버변수추가 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; namespace MainChat public partial class Form1 : Form // 채팅처리를전담하는 Network 클래스객체변수선언 private Network net = null; private Thread server_th = null; // 채팅서버스레드선언 private string my_ip = null; // 자신의 ip 주소를기록할변수 public Form1() InitializeComponent(); net = new Network(this); // 네트워크클래스객체생성 순천향대학교컴퓨터학부이상정 8

Form1.cs: 이벤트처리기추가 (1) Form1 의이벤트처리기추가 Form을선택한후이벤트처리기에서 Load와 FormClosed 이벤트처리기추가 Load 이벤트처리기 채팅서버로동작하게하는쓰레드를생성하고시작 FormClosed 이벤트처리기 생성된쓰레드를종료 순천향대학교컴퓨터학부이상정 9 Form1.cs: 이벤트처리기추가 // 채팅창이출력되기직전에실행되는이벤트 private void Form1_Load(object sender, EventArgs e) my_ip = net.get_myip(); // 자신의 ip 정보알아내기 // 채팅서버를시작시키는쓰레드를생성 server_th = new Thread(new ThreadStart(net.ServerStart)); server_th.start(); // 채팅서버시작 // 채팅창이닫힌후발생하는이벤트 ( 프로그램이종료될때 ) private void Form1_FormClosed(object sender, FormClosedEventArgs e) if (btn_connect.text == " 접속중...") // 클라이언트로수행중 net.disconnect(); // 채팅서버와연결되어있으면연결끊기 else // 서버로수행중 net.serverstop(); // 채팅서버실행중지 if (server_th.isalive) server_th.abort(); //ServerStart 스레드를종료 catch(exception ex) MessageBox.Show(ex.Message); Message); // 예외메시지출력 순천향대학교컴퓨터학부이상정 10

Form1.cs: 버튼이벤트처리기 [ 연결 ] 버튼에대한 [Click] 이벤트처리기를작성 프로그램이클라이언트로동작 private void btn_connect_click(object Click(object sender, EventArgs e) if (btn_connect.text == " 연결 ") // 채팅서버에접속할경우 string ip = txt_ip.text.trim(); // 접속할서버 ip 주소가져오기 if (ip == "") // 접속할채팅서버의 ip 주소를입력하지않았다면 MessageBox.Show(" 아이피번호를입력하세요!"); // 에러메시지출력 return ; if (!net.connect(ip)) // 채팅서버에접속시도 MessageBox.Show(" 서버아이피번호가틀리거나 r n 서버가작동중이지않습니다."); else btn_connect.text =" 접속중..."; // 접속이성공하면버튼문자열변경 else // 채팅을종료할경우 net.disconnect(); // 채팅서버와연결을끊음 btn_connect.text = " 연결 "; // 버튼문자열을 접속중.. 에서 연결 로변경 순천향대학교컴퓨터학부이상정 11 Form1.cs: txt_input 이벤트처리기 txt_input 텍스트박스의 KeyDown 이벤트처리기추가 채팅메시지를입력하고엔터를치면상대컴퓨터로입력한메시지를전송 Form1 클래스에멤버메서드인 Add_MSG 를추가 채팅문자열을텍스트박스 txt_info 에추가 private void txt_input_keydown(object sender, KeyEventArgs e) // 엔터키가눌리면문자열메시지를상대방에게전송 if ( e.keycode == Keys.Enter ) string msg = txt_input.text.trim(); Add_MSG("[ 본인 ] " + msg); net.send(msg); // 메시지전송 txt_input.text = ""; // 다음메시지입력을위해비워둔다. txt_input.focus(); public void Add_MSG(string msg) txt_info.appendtext(msg info.appendtext(msg+" r n"); // 채팅문자열출력 txt_info.scrolltocaret(); // 텍스트박스의내용을현재캐럿위치까지스크롤 txt_input.focus(); //txt_input 텍스트박스에초점맞춤 순천향대학교컴퓨터학부이상정 12

소켓통신, Network 클래스 순천향대학교컴퓨터학부이상정 13 Network 클래스 소켓통신을전담처리하는 Network 클래스작성 [ 솔루션탐색기 ] 에서 MainChat 프로젝트를선택하고마우스오른쪽버튼을클릭한후 [ 추가 ]-[ 새항목추가..] 를선택 새항목추가창에서 [ 클래스 ] 템플릿을선택하고이름에 Network.cs 라고입력한후 [ 열기 ] 버튼을클릭하고프로그램작성 Network 클래스실행동작 채팅서버로실행된다면 ServerStart 메서드와 ServerStop 메서드를사용 클라이언트로사용된다면 Connect 메서드와 DisConnect 메서드를사용 모든데이터는 Receive, Send 메서드를통해바이트단위로수신 / 송신 순천향대학교컴퓨터학부이상정 14

프로그램구성도 순천향대학교컴퓨터학부이상정 15 using System; using System.Net; using System.Net.Sockets; using System.Threading; using System.Text; // 네트워크처리 // 소켓처리 // 쓰레드처리 // 문자열처리 namespace MainChat public class Network Form1 wnd = null; // 채팅창객체변수 Socket server = null; // 채팅서버 ( 접속을받는소켓 ) 로사용할소켓 Socket client = null; // 서버일경우통신소켓, 클라이언트일경우접속및통신용소켓 Thread th = null; // 쓰레드처리 public Network(Form1 wnd) // 생성자 this.wnd = wnd; // NetWork 클래스에서 Form1의멤버를사용하도록허용 // 채팅서버시작 : 클라이언트접속을받고메시지를수신 public void ServerStart() // 서버포트번호를 7000번으로지정 IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 7000); server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); p) server.bind(ipep); // 소켓과서버 ip, 포트번호를바인드 server.listen(10); // 클라이언트접속을대기 wnd.add_msg(" 채팅서버시작..."); 순천향대학교컴퓨터학부이상정 16

client = server.accept(); // 클라이언트가접속할때활성화 // 접속한클라이언트 ip 주소를출력 IPEndPoint ip = (IPEndPoint)client.RemoteEndPoint; wnd.add_msg(ip.address + " 접속..."); //Receive 메서드를스레드로생성하고시작 th = new Thread(new ThreadStart(Receive)); th.start(); // 채팅서버에서예외가발생하면 wnd.add_msg(ex.message); // 예외메시지 txt_info에출력 // 채팅서버중지 public void ServerStop() if (client!= null) // 클라이언트가접속된상태라면 if (client.connected) client.close(); // 통신소켓을닫습니다. if (th.isalive) // Receive 스레드가실행중이라면 th.abort(); // 쓰레드종료 server.close(); // 서버소켓을닫습니다. 순천향대학교컴퓨터학부이상정 17 // 예외메시지출력 wnd.add_msg(ex.message); // 채팅서버와연결 public bool Connect(string ip) // 접속할채팅서버 ip 주소와포트번호를지정 IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(ip), 7000); client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); client.connect(ipep); wnd.add_msg(ip + " 서버에접속성공..."); // 채팅문자열을수신하는메서드를스레드로생성하고시작 th = new Thread(new ThreadStart(Receive)); th.start(); return true; wnd.add_msg(ex.message); return false; // 접속성공하면 true 값을반환 // 채팅서버에접속을시도 // 채팅서버접속에실패하면예외메시지를출력 // 접속실패했으면 false 값을반환 순천향대학교컴퓨터학부이상정 18

// 채팅서버와연결종료 public void DisConnect() if (client!= null) if (client.connected) client.close(); // 채팅서버와연결되어있다면 // 채팅서버와의연결을단절 if (th.isalive) th.abort(); wnd.add_msg(" 채팅서버연결종료!"); //Receive 메서드쓰레드를중지 // 채팅서버연결해제와쓰레드종료시예외가발생하면 wnd.add_msg(ex.message); // 예외메시지출력 순천향대학교컴퓨터학부이상정 19 // 상대방에게데이터송신 public void Send(string msg) if (client.connected) // 상대방과연결되어있으면 // 문자열을바이트배열형태로변경합니다. byte[] data = Encoding.Default.GetBytes(msg); SendData(data); // 바이트배열을상대방에전송 else // 상대방과연결되어있지않다면 wnd.add_msg(" 메시지전송실패!"); wnd.add_ MSG(ex.Message); private void SendData(byte[] data) int offset = 0; int size = data.length; int left_data = size; int send_data = 0; 순천향대학교컴퓨터학부이상정 20 // 버퍼내위치 // 전송할바이트배열의크기 // 남은데이터량 // 전송된데이터크기

// 전송할실제데이터의크기전달 byte[] data_size = new byte[4]; // 정수형태로데이터크기전송 data_size = BitConverter.GetBytes(size); send_data data = client.send(data_size); // 실제데이터전송 while (offset < size) send_data = client.send(data, offset, left_data, SocketFlags.None); offset += send_data; left_data -= send_data; // 데이터전송중예외가발생하면에러메시지출력 wnd.add_msg(ex.message); // 상대방의데이터수신 public void Receive() // 상대방과연결되었다면 while (client!= null && client.connected) //ReceiveData 메서드를사용해바이트단위로데이터를읽어옵니다. byte[] data = ReceiveData(); wnd.add_msg("[ 상대방 ]" + Encoding.Default.GetString(data)); 순천향대학교컴퓨터학부이상정 21 wnd.add_msg(ex.message); private byte[] ReceiveData() int offset = 0; // 버퍼내위치 int size = 0; // 수신할데이터크기 int left_data = 0; // 남은데이터크기 int recv_data = 0; // 수신한데이터크기 // 수신할데이터크기알아내기 byte[] data_size = new byte[4]; recv_data = client.receive(data_size, 0, 4, SocketFlags.None); size = BitConverter.ToInt32(data_size, 0); left_ data = size; byte[] data = new byte[size]; // 바이트배열생성 // 서버에서전송한실제데이터수신 while (offset < size) // 상대방이전송한데이터를읽어옴 recv_data = client.receive(data, offset, left_data, SocketFlags.None); if (recv_data == 0) break; offset += recv_data; left_data -= recv_data; return data; 순천향대학교컴퓨터학부이상정 22

// 데이터수신중예외가발생하면에러메시지출력 wnd.add_msg(ex.message); return null; // IP 주소구하기 public string Get_MyIP() IPHostEn host = Dns.Resolve(Dns.GetHostName()); // 첫번째 ip 주소를사용 string myip = host.addresslist[0].tostring(); return myip; 순천향대학교컴퓨터학부이상정 23 과제 앞의채팅프로그램실행시루프백주소가아닌두개의 PC 사이에서채팅실습 순천향대학교컴퓨터학부이상정 24