'1. IT Story/Development'에 해당되는 글 33건

insertionSort

 

main.cpp 

#include <iostream>
#include <iomanip>
#define MAX_ARY_SIZE 15
using namespace std;
void insertionSort(int list[], int last);

int main()
{
 int ary[MAX_ARY_SIZE] = {12,123,34,12,3,65,78,45,67,45,78,65,5,454,576};

 cout<<"before sort"<< endl;

 for(int i=0; i<MAX_ARY_SIZE; i++)
 {
  cout<< setw(5)<< *(ary+i);
 }
 cout<<endl;

 insertionSort(ary,MAX_ARY_SIZE-1);
 
 cout<<"after sort"<< endl;

 for(int i=0; i<MAX_ARY_SIZE; i++)
 {
  cout<< setw(5)<< *(ary+i);
 }
 cout<<endl;
}

void insertionSort(int list[], int last)
{
 int current =1;
 int hold;
 int walker;

 for(current = 1; current <=last; current++)
 {
  hold = list[current];
  walker = current -1;
  
  for(walker=current-1; walker >=0 && hold<list[walker]; walker--)
  {
   list[walker +1] = list[walker];

   cout << "passs"<<walker<<endl;

   for(int i=0; i<MAX_ARY_SIZE; i++)
   {
   cout<< setw(5)<< *(list+i);
   }
   cout<<endl;
  }

  list[walker +1]= hold;
 }
 
}
/*
void insertionSort(int list[], int last)
{
 int current =1;
 int hold;
 int walker;

 while(current<=last) // for(current = 1; current <=last; current++)
 {
  hold = list[current];
  walker = current -1;
  
  while(walker>=0 && hold < list[walker])//for(walker=current-1; walker >=0 && hold<list[walker]; walker++)
  {
   list[walker +1] = list[walker];
   walker = walker -1;
  }
  list[walker +1]= hold;
  current = current +1;
 }
 return;
}
*/

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

배열로 구현한 Stack을 이용한 중위식구하기  (0) 2012.03.29
seqSearch  (0) 2012.03.29
AddressListing  (0) 2012.03.29
링크드리스트ADT를 이용한 학생성적관리 Pro  (0) 2012.03.29
Heap Tree (보기좋게출력)  (0) 2012.03.28
하노이타워  (0) 2012.03.28
이진찾기  (0) 2012.03.28
피보나치  (0) 2012.03.28
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,

Heap을 이용한 Tree 생성

 

Heap.h

#define HEAP_SIZE 15

void reheapUp(int heap[], int newNode);
void reheapDown(int heap[], int root, int last);
void buildHeap(int heap[], int size);

bool insertHeap(int heap[], int& last, int data);
bool deleteHeap(int heap[], int& heapLast, int& dataOut);
void swap(int heap[],int root,int largeChildIndex);

void reheapUp(int heap[], int newNode)
{
 int parent;
 //int hold;


 if (newNode !=0) // if(newNode)
 {
  parent=(newNode-1)/2;

  if(heap[newNode] > heap[parent])
  {
   swap(heap, newNode, parent);

   /*hold = heap[parent];
   heap[parent]=heap[newNode];
   heap[newNode] = hold;*/

   reheapUp(heap, parent);
  }
 }
 return;
}

 

void reheapDown(int heap[], int root, int last)
{
 //int hold;
 int rightKey;
 int leftKey;
 int largeChildKey, largeChildIndex;

 if((root * 2 + 1) <= last)
 {
  leftKey=heap[root * 2 + 1];

  if(root * 2 + 2<=last)
  {
   rightKey = heap[root * 2 + 2];
  }
  else
  {
   rightKey = -1; // 아주작은값!
  }
  // 자식들중에 큰 키 찾기
  
  if(leftKey>rightKey)
  {
   
   largeChildKey = leftKey;
   largeChildIndex = root * 2 + 1;
  }
  else
  {
   largeChildKey = rightKey;
   largeChildIndex = root * 2 + 2;
  }

  if(heap[root]< largeChildKey)
  {
   swap(heap, root, largeChildIndex);

   /*int hold = heap[root];
   heap[root]=heap[largeChildIndex];
   heap[largeChildIndex] = hold;*/
   
   reheapDown(heap, largeChildIndex, last);
  }
 }
 return;
}

void swap(int heap[],int newNodeRoot,int parentLargeChildIndex)
{
 int hold = heap[newNodeRoot];
 heap[newNodeRoot]=heap[parentLargeChildIndex];
 heap[parentLargeChildIndex] = hold;
}

bool insertHeap(int heap[], int& last, int data)
{
 

 if(last == HEAP_SIZE -1)
 {return false;}

 ++last;
 heap[last]=data;
 reheapUp(heap, last);

 return true;
}
bool deleteHeap(int heap[], int& last, int& dataOut)
{
 
 if(last<0)
 {
  return false;
 }
 
 dataOut = heap[0];
 heap[0]=heap[last];
 last--;
 reheapDown(heap, 0, last);
 return true;
}

 

main.cpp

#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <ctype.h>

#define HEAP_SIZE 15
#include "Heap.h"

using namespace std;

char getAction(void);
void printHeap (int heap[], int root, int heapLast, int level);

int main(void)
{
 int heap[HEAP_SIZE];

 int data;
 int heapLast;
 int bldLooper;
 int bldIndex;
 int result;

 char action;

 cout << "힙 검증 시작"<<"\n";

 heapLast = HEAP_SIZE / 2 - 1;
 bldIndex = -1;

 cout << "heapLast: "<<heapLast << endl;
 for(bldLooper = 0;
  bldLooper <= heapLast;
  bldLooper++)
 {
  data = rand() % 999 + 1;
  insertHeap(heap, bldIndex, data);
  cout <<"data: "<<data<<endl;
 }
  
 cout<<"\n 힙 생성 완료 \n\n";

 do{
  action=getAction();

 switch(action)
 {
 case 'I':
  cout << "정수 한개를 넣으시오: ";
  cin>>data;

  result=insertHeap(heap,heapLast, data);

  if(result)
  {
   cout<<data<<" 삽입됨.\n";
  }
  else
  {
   cout<<" 힙 넘침\a\n";
  }
  break;
 case 'D' :
  result=deleteHeap(heap,heapLast, data);
  if(result)
  {
   cout<<data<<" 삭제됨.\n";
  }
  else
  {
   cout << "힙이 비었음. 삭제할 수 없음\a\n";
  }
  break;
 case 'P':
   printHeap(heap,0,heapLast,0);
   break;
 case 'Q':
   break;
 default :
  cout << "main에서 불가능한 오류 방생"<<endl;
  exit(100);
  break;
 
 }
 }while(action != 'Q');

 cout<< "힙 검증 끝"<<endl;

 return 0;

}


char getAction(void)
{
 char action;
 bool OK;

 do{
 
  cout<<"\n처리할 행위를 넣으시오<[P]rint, [I]nsert, [D]elete, [Q]uit>: ";
  cin>> action;
  cout<<endl;
  action = toupper(action);

  switch(action)
  {
   case 'P':
   case 'I':
   case 'D':
   case 'Q': OK = true;
        break;
   default :
       OK=false;
       cout << "<" << action << ">" << "잘못된 입력: ";
       cout << "다시 입력하세요\a\a\n" << action;
       break;
  }
  }while(!OK);
 
 return action;

}

void printHeap (int heap[], int root, int heapLast, int level)
{
 int child;
 int i;

 if(root <= heapLast)
 {
  child = (root * 2 + 1);
  printHeap(heap, child+1, heapLast, level +1);

  for(i=0; i<level; i++)
  {
   cout<< "    ";
  }

  cout << setw(4) << heap[root] << endl;
   
  printHeap(heap, child, heapLast, level+1);
 }
 return;
}

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

seqSearch  (0) 2012.03.29
AddressListing  (0) 2012.03.29
링크드리스트ADT를 이용한 학생성적관리 Pro  (0) 2012.03.29
insertionSort  (0) 2012.03.28
하노이타워  (0) 2012.03.28
이진찾기  (0) 2012.03.28
피보나치  (0) 2012.03.28
윈도우폰 게임개발 기초(WindowPhoneGame)  (0) 2012.03.07
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,

 

하노이타워

 

#include<iostream>
#include<iomanip>

using namespace std;

void tower(int n, char source, char dest, char aux);

int main()
{
 int numDisks;
 cout<<"디스크 몇개?";
 cin>> numDisks;
 cout<<"하노이의 탑 시작"<<endl;

 tower(numDisks, 'A', 'C', 'B');

}
void tower(int n, char source, char dest, char aux)
{
 static int step=0; //항상유지되길 원하면 Static사용해라!!

 cout<<"Tower (" << n << " , " << source << "," << dest << "," << aux<<")" <<endl;

 if(n==1)
 {
  cout << "\t\t\t스텝" <<++step << source << "에서" << dest << "로 옮김" << endl;
 }
 else
 {
  tower(n-1, source, aux,dest);

  cout << "\t\t\t스텝" <<++step << source << "에서" << dest << "로 옮김" << endl;

  tower(n-1, aux,dest,source);
 }
 return;

}

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

AddressListing  (0) 2012.03.29
링크드리스트ADT를 이용한 학생성적관리 Pro  (0) 2012.03.29
insertionSort  (0) 2012.03.28
Heap Tree (보기좋게출력)  (0) 2012.03.28
이진찾기  (0) 2012.03.28
피보나치  (0) 2012.03.28
윈도우폰 게임개발 기초(WindowPhoneGame)  (0) 2012.03.07
C# 채팅 프로그램(Client 확장)  (0) 2012.03.07
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,

이진찾기

#include <iostream>
#include <iomanip>
using namespace std;

bool bi_Iterative(int list[], int end, int target, int & locn);

bool bi_Recursive();

const int SIZE=100;

int main(void)
{
 int list[SIZE];

 int srchArgu;
 int foundLocn;

 //배열 채우기

 for(int i=0; i < SIZE; i++)
 {
  list[i]=2*i;
 }
 
 for(int i=0; i < SIZE; i++)
 {
  if(i%10==0)
  {
   cout<<endl;
  }
  else
  {
   cout<<setw(4)<<list[i];
  }
 }

 cout<<endl<<"원하는 숫자입력:";
 cin>>srchArgu;

 bool res=bi_Iterative(list, SIZE-1,srchArgu,foundLocn);
 
 if(res ==true)
 {
  cout<<"데이터 찾음"<<list[foundLocn]<<endl;
 }
 else
 {
  cout<<srchArgu<<"데이터를 못찾음"<< endl;
 }
}

bool bi_Iterative(int list[], int end, int target, int & locn)
{
 int first=0, mid, last=end;
 

 while(first<=last)
 {
  mid=(first+last)/2;
  if(target>list[mid])
  {
   first=mid+1;
  }
  else if(target<list[mid])
  {
   last=mid-1;
  }
  else
  {
   break;
  }
 }

 locn=mid;
 
 return (target== list[mid]);

}

 

 

 

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

링크드리스트ADT를 이용한 학생성적관리 Pro  (0) 2012.03.29
insertionSort  (0) 2012.03.28
Heap Tree (보기좋게출력)  (0) 2012.03.28
하노이타워  (0) 2012.03.28
피보나치  (0) 2012.03.28
윈도우폰 게임개발 기초(WindowPhoneGame)  (0) 2012.03.07
C# 채팅 프로그램(Client 확장)  (0) 2012.03.07
C# 채팅 프로그램(Server 확장)  (4) 2012.03.07
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,

 

피보나치

 

#include <iostream>
#include <iomanip>
using namespace std;
long fib(long num);

int main(void)
{
 int looper;
 int seriesSize;

 cout<< "몇개출력?";
 cin>>seriesSize;
 
 for(int i=0; i<seriesSize; i++)
 {
  cout<< fib(i) <<endl;
 }
}

long fib(long num)
{
//베이스케이스

   if(num==0 || num ==1)
   {
 return num;
   }

 //제너럴케이스
   else
   {
     return(fib(num-1)+ fib(num-2));
   }

}

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

insertionSort  (0) 2012.03.28
Heap Tree (보기좋게출력)  (0) 2012.03.28
하노이타워  (0) 2012.03.28
이진찾기  (0) 2012.03.28
윈도우폰 게임개발 기초(WindowPhoneGame)  (0) 2012.03.07
C# 채팅 프로그램(Client 확장)  (0) 2012.03.07
C# 채팅 프로그램(Server 확장)  (4) 2012.03.07
C# 채팅 프로그램(Client)  (0) 2012.03.07
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,




 윈도우폰 게임개발 기초
 



윈도우폰 개발에 사용되는 함수와 참조하는 클래스들에 대해서 알아보도록 하자.
실제 윈도우폰 게임 개발을 열었을 때 나오게되는 소스에 대해서 분석해보았다. 
 

using System;
using System.Collections.Generic;
using System.Linq;

using Microsoft.Xna.Framework;//XNA 프레임워크 라이브러리(손쉬운 게임개발)

using Microsoft.Xna.Framework.Audio; // XACT로 만든 프로젝트 및 콘텐츠 오디오 파일을 재생하고 낮은 수준의 인터페이스 방식에서 조작할 수 있는 클래스제공

using Microsoft.Xna.Framework.Content;// 게입에서 사용하는 자원들을 각 파일 포맷에 따리 관리하고 유지하는데 필요한 클래스

using Microsoft.Xna.Framework.GamerServices; // xbox LIVE와 관련된 기능을 담당하는 모듈로 LIVE 관린 GUI등이 포함, 
                                             //게이머의 데이터와 직접 통신하거나 게이머의 선택을 반영할 수 있는 API제공

using Microsoft.Xna.Framework.Graphics; // 3D오브젝트를 표시하는 하드웨어 가속 기능과 렌더링을 포함하는 낮은 수준의 응용프로그램 인터페이스를 제공

using Microsoft.Xna.Framework.Input; //xbox360 컨트롤러 장치와 키보드, 마우스의 입력을 받을 수 있는 함수와 클래스를 제공
using Microsoft.Xna.Framework.Input.Touch;
using Microsoft.Xna.Framework.Media; // 음악과 앨범, 재생목록, 사진 등의 자료 재생 및 접근과 관련된 클래스 제공

using Microsoft.Xna.Framework.Net;  // XNA프레임워크 게임상에서 Xbox Live 멀티 플레이어 지원 및 네트워킹을 구혀하는 클레스 제공

using Microsoft.Xna.Framework.Storage; // 저장장소의 파일을 읽고 쓰는 것을 담당하는 클래스를 제공



namespace WindowsPhoneGame2
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    /// 
    public class Game1 : Microsoft.Xna.Framework.Game // 상속을 받았음.
    {
        GraphicsDeviceManager graphics; //그래픽디바이스매니저
        SpriteBatch spriteBatch; //이미지 출력시 다양한 옵션제공

        //SpriteFont spriteFont;
        //String messagetext = "Hello Windows Phone 7";

        Texture2D texture; //텍스처 
        


        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";

            // Frame rate is 30 fps by default for Windows Phone. 프래임속도 30프래임
            TargetElapsedTime = TimeSpan.FromTicks(333333);

            graphics.SupportedOrientations = DisplayOrientation.LandscapeLeft | DisplayOrientation.LandscapeRight | DisplayOrientation.Portrait;
                                               //단말기 왼쪽이 밑변인 가로방향      단말기 오른쪽이 밑변인 가로 방향                   세로방향
            
            graphics.PreferredBackBufferWidth = 350;
            graphics.PreferredBackBufferHeight = 250;

            // Extend battery life under lock. // 잠금에 따라서 배터리 수면연장
            InactiveSleepTime = TimeSpan.FromSeconds(1);
        }

        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()  // 게임이 시작되었을 때 초기에 실행되며 기본적인 게임 관련 설정을 수행함. 이니셜라이즈~
        {
            // TODO: Add your initialization logic here

            base.Initialize(); //최상위에 있는 함수의 기능을 사용할떄 base.
        }

        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        /// 

        protected override void LoadContent() // 2D이미지 또는 3D 모델, 음원 등의 콘텐츠들을 게임 내에서 사용하기 위한 역할을 수행함.
        {


            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);

            // TODO: use this.Content to load your game content here

            //spriteFont = Content.Load<SpriteFont>("HelloFont");

            texture = new Texture2D(GraphicsDevice, graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight);
                                                                                            //그래픽 디바이스, 그래픽의 너비와 크기 지정
            texture = Content.Load<Texture2D>("exDog");  // 해당 2D 이미지 가져오기
            
            
        }

        /// <summary>
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// </summary>
        /// 

        protected override void UnloadContent()  // LoadContent 메서드에서 로드한 콘텐츠들을 해제하는 역할을 게임 종료 또는 장치변경시 수행함.
        {
            // TODO: Unload any non ContentManager content here
        }

        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        /// 

        protected override void Update(GameTime gameTime) //캐릭터의 이동, 전투처리, 키보드, 게임 패드 등의 입력장치 
                                                          //처리등의 게임 로직부분을 처리하는 가장 중요한 부분.
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            // TODO: Add your update logic here

            base.Update(gameTime);//최상위에 있는 함수의 기능을 사용할떄 base.
        }

        /// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        /// 

        protected override void Draw(GameTime gameTime) // 배경화면, 주인공 등 게임에 표현되는 2D 이미지와 3D모델, 텍스트 등을 화면에 출력하는 기능을 수행.
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            // TODO: Add your drawing code here

            //spriteBatch.Begin(); //일괄적으로 시작
           //spriteBatch.DrawString(spriteFont, messagetext, Vector2.Zero, Color.Black); //폰트적용, 메시지, 위치, 색
            //spriteBatch.End();


            spriteBatch.Begin(); // 출력시작

            spriteBatch.Draw(texture, new Vector2(0,0), Color.Red); //이미지 출력
           

            spriteBatch.End(); //이미지 출력완료

            base.Draw(gameTime); //최상위에 있는 함수의 기능을 사용할떄 base.
        }
    }
}




참고사이트

* MSDN Phone Page - http://msdn.microsoft.com/ko-kr/gg415576

* 서진호의윈도우폰이야기http://blogs.msdn.com/jinhoseo

* Windows Phone Korea –http://www.facebook.com/windowsphonekorea

*Windows Phone Training Kit- http://msdn.microsoft.com/en-us/hh220612 

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

Heap Tree (보기좋게출력)  (0) 2012.03.28
하노이타워  (0) 2012.03.28
이진찾기  (0) 2012.03.28
피보나치  (0) 2012.03.28
C# 채팅 프로그램(Client 확장)  (0) 2012.03.07
C# 채팅 프로그램(Server 확장)  (4) 2012.03.07
C# 채팅 프로그램(Client)  (0) 2012.03.07
선택정렬응용  (0) 2012.03.07
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,


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


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 ChatClient
{
    public partial class MainForm : Form
    {
        TcpClient Client;   // 서버+클라이언트기능을 하기위해서
        StreamReader Reader; //스트림 값을 읽어오기 위해서
        StreamWriter Writer; //스트림 값을 쓰기위해서
        NetworkStream stream; //네트워크스트림 연결을 위해서
        Thread ReceiveThread; //멀티쓰레드를 위해서
        bool Connected;  // 연결상태확인

        private delegate void AddTextDelegate(string strText);

        public MainForm()
        {
            InitializeComponent();
        }

        private void MainForm_FormClosing(object sender, FormClosedEventArgs e) //종료버튼을 눌렀을때
        {
            Connected = false;

            if (Reader != null)
                Reader.Close();

            if (Writer != null)
                Writer.Close();

            if (Client != null)
                Client.Close();

            if (ReceiveThread != null)
                ReceiveThread.Abort();
        }

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

            txtSend.Clear(); // 글을 작성하는 부분 클리어
        }

        private void ConnectBtn_Click(object sender, EventArgs e)
        {
            if (txtIP.Text == "") //ip 않적고 눌르면
            {
                MessageBox.Show("서버IP 주소를 입력해 주세요", "", MessageBoxButtons.OK, MessageBoxIcon.Error); //에러 창 뜨게하기
            }1

            try
            {

                String IP = txtIP.Text; // ip쓰는 창에서 IP값 바다오기
                int port = 8080; //포트설정

                Client = new TcpClient();  //클라이언트 생성
                Client.Connect(IP, port);  //클라이언트 서버에 연결

                stream = Client.GetStream(); // 클라이언트의 스트림값 받아오기
                Connected = true; // 서버연결성공시 true
                txtMessage.AppendText("서버와 연결되었습니다" + "\r\n");

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

                ReceiveThread = new Thread(new ThreadStart(Receive)); //클래스를 통해서 값을 받는다.
                ReceiveThread.Start(); // 값을 받는 스레드 실행
            }
            catch(Exception ConnE)
            {
                txtMessage.AppendText("서버에 연결할 수 없습니다." + "\r\n");
            }

        }

        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)
            {

            }

        }

        private void MainForm_Load(object sender, EventArgs 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
피보나치  (0) 2012.03.28
윈도우폰 게임개발 기초(WindowPhoneGame)  (0) 2012.03.07
C# 채팅 프로그램(Server 확장)  (4) 2012.03.07
C# 채팅 프로그램(Client)  (0) 2012.03.07
선택정렬응용  (0) 2012.03.07
이름정렬  (0) 2012.03.07
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,


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와 함께 살아가는 삶

,