C# 채팅 프로그램 만들기(Client)
 


C#을 이용하여 간단한 채팅프로그램을 만들어 보자.
채팅프로그램을 만드는 것을 통하여 간단한 소켓통신에 대해서 알아보고 활용해 보자.

채팅을 하기 위해서는 서버와 클라이언트가 필요하다. 


using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;


using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace Ex_chatClient
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            NetworkStream stream; 
            StreamReader Reader;

            TcpClient Client = new TcpClient();  //클라이언트 생성
            String DestIP= "localhost"; // 연결할 IP주소

            Client.Connect(DestIP, 8080); // IP 주소와 포트, 서버에 연결을 요청

            stream = Client.GetStream(); // NetWorkStream을 생성한 후 서버에서 보낸 데이터를 읽어들임
            
            Reader = new StreamReader(stream); //스트림으로 받아와서 

            string tempStr = Reader.ReadLine(); // 스트림 값을 읽어서

            txtReceive.AppendText(tempStr);  // tetReceive에 출력

            Client.Close(); //클라이언트 종료

        }
    }


참고자료
 

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

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

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

운명을바꾸는자

IT와 함께 살아가는 삶

,

 

선택정렬응용

 

 

 


#include <iostream>
#include <iomanip>  // 전처리기  setw() 필드 폭 설정

using namespace std;

void sel(int *a , int b);   //선택정렬

void print(int *a , int  b);    //출력

int main()

{
    int size;

 cout << "몇 개를 입력 할까요??"<< endl;  // 사이즈 입력
    cin >> size;


 int *A= new int[size];    // 사이즈 만큼 메모리 할당

 cout << setw(6)<<"임의로 받은 수" <<endl;  
 for(int x=0; x<size; x++)
    {
    A[x]=rand()%100;                 // 1~100사이의 임의의 수를 넣는다.
    cout <<setw(6)<< A[x];
    }
     cout <<endl;

 int len= size;      // 임의의 배열 크기 측정
   
 sel(A , len);   // 선택 정렬  <배열앞에 &을 붙이지 않아도 됨.>
                    //         <왜냐하면 배열의 이름은 첫번째 주소의 주소값을 나타내기 때문임.>
 print(A , len);    //출력     <배열 전달 시 포인터 나 배열로 받아야함!!>
  
    delete [] A;   // 메모리 해제
}

 

void sel(int *a , int b)
{

  for(int i =1; i <=b-1; i++)
  {

 int hold = a[i];
    int walker = i-1;

 while(walker >= 0 && hold< a[walker])
 {
  
    a[walker+1]=a[walker];
    walker=walker-1;
    cout << endl;
   
 }
 a[walker +1] = hold;
    cout << endl;
 

          for(int k=0; k<b; k++)
    {
   
      if(hold==a[k])
   {
    cout << setw(6)<< "<" ;
   }
   else if(hold== a[k])              //변화 단계 출력
   {
    cout << setw(6)<< "[";
   }
   cout << setw(6)<< a[k];
   if(hold== a[k])
    cout << setw(6) <<">";
   else if(hold == a[k])
   {
    cout << setw(6)<<"]";
   }
    

    }
   
  }  
}

void print(int *a, int  b)
{
 cout << endl;
 cout << "정렬완료"<< endl;
 for(int i=0; i<b; i++)        // 배열의 크기만큼 루프를 돌려 a[i]출력.
 {
 
  cout<< setw(6)<<a[i];  // 6만큼 필드 폭을 설정하여 a[i]출력.
     
 }
 cout << endl;

}

블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,


 

이름정렬

 

 

strcmp 의 기능중에 문자의 순서를 검사 해주는 기능이 있다.

 

>0  일때          앞에 있는 것이 큰지

==0 일때         같음을 알려주고

<0 일때           뒤에 있는 것이 큰지

 

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

void sort_name(char(*name)[20]);
void inpt_name(char(*name)[20]);
void prnt_name(char(*name)[20]);

int main()
{
 

 char name[10][20];

 

 inpt_name(name);
 cout <<"\n===정렬전 데이터===\n"<<endl;
 prnt_name(name);
 sort_name(name);
 cout <<  "\n===정렬후 데이터===\n"<<endl;
 prnt_name(name);

 return 0;
}

void inpt_name(char(*name)[20])
{
 int i;
 for(i=0;i<5;i++)
 {
  cout<< i+1 <<"번째 이름을 입력하시오 :"<< endl;
  cin>>name[i];
 }
}


void sort_name(char(*name)[20])
{
 int i, k;
 char temp[20];

 for(k=0;k<5;k++)
 {
  for(i=k+1;i<5;i++)
  {
   if(strcmp(name[k],name[i])>0)
   {
    strcpy(temp,name[k]);
    strcpy(name[k],name[i]);
    strcpy(name[i],temp);
   }
  }
 }
}


 void prnt_name(char(*name)[20])
{
 int i;
 for(i=0 ;i<5 ;i++)
 {
   cout << name[i] << endl;
 }


}


블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,

 

 

링크드리스트를 이용한 학생관리Pro

 

 

 

#include <iostream>
#include <iomanip>
#include <cstring>   // 문자 비교함수 이용.

using namespace std;


struct student
{
  char name[20]; // 이름
  char s;   // 성별
  int y;   //연령
  char c[20];  //출생지

  student *p;
};

student *p1;

enum menu {add_student, del_student, n_student, s_student, c_student, show_all, quit};
//메뉴 -   학생추가, 선택삭제 및 중복 삭제, 이름검색,  성비검색,  출생지 명수, 전체보기, 나가기

menu showMenu();

//bool Mystrcmp(char x[], char y[]);                      // 문자 비교함수 제외 하고 제공해주는 strcmp(a,b)==0 문자 비교함수 이용

bool addStudent(student *sp, int maxsize, int &num);    // 학생 추가함수
bool delStudent(student *sp, int maxsize, int &num);    // 삭제 함수
void namechcak(student *sp, int num);                   // 이름 중복 체크 함수
void c_chcak(student *sp, int num);                     // 도시 중복 체크 함수
void n1_student(student *sp, int num);                  // 이름 검색함수
void s1_student(student *sp, int num);                  // 성비 검색함수
void c1_student(student *sp, int num);                  // 출생지 명수보기함수
void showall(student *sp, int num);                     // 전체 출력함수

int main()
{
   int size=0;
 
 cout << " 몇 명의 사람을 입력하겠습니까??" << endl;
    cin>> size;                         //동적 메모리 할당 크기 지정

    student *slist= new student[size];  //동적 메모리 할당

    int numofstudents = 0;              //입력받은 학생수

 bool flag = false;                  //종료시 사용되는 flag

 menu select;                      

 while(true)
 {
   select = showMenu();              //메뉴함수 콜

   switch(select)
   {
   case add_student :    
    { 
     bool success;            
   
     success= addStudent(slist, size, numofstudents);  //타입이 bool addStudent()인 함수 출력

              namechcak(slist,  numofstudents);                 //함수 중복 체크
     c_chcak(slist,  numofstudents);                   //함수 중복 체크
 

    break;

    }
 case  del_student :                                        //선택 삭제 및 중복 삭제
    { 
     bool success1;
   
     success1 = delStudent(slist, size, numofstudents);

    break;

    }
      case n_student :
    { 
    n1_student(slist, numofstudents);                 //타입이 void인 함수 출력
    break;
    }


      case s_student :
    { 
     s1_student(slist, numofstudents);                //타입이 void인 함수 출력

    break;
    }
      case c_student :
    { 
     c1_student(slist, numofstudents);                //타입이 void인 함수 출력

    break;
    }

   case  show_all :
    {
            showall(slist, numofstudents);                     //타입이 void인 함수 출력

    break;
    }
   case quit :
    {
     flag=true;
    break;
    }
   default :

    cout << "올바르지 않은 입력입니다." << endl;
    break;
   }//switch 끝

   if(flag==true)
   { 
    break;
   }
 }//while 끝

   delete [] slist;     //동적 할당 해제

  return 0;

}
 
menu showMenu()
{
  menu ret;

  bool flag = false;

while(true)
 {
   cout << endl;
      cout << "--------메뉴--------"<<endl;
      cout << "1.입력"  <<endl;
   cout << "2.선택 삭제"  <<endl;
      cout << "3.이름으로 검색" <<endl;
      cout << "4.성비 검색" <<endl;
      cout << "5.출생지 명수보기" <<endl;
      cout << "6.전체 표시" << endl;
      cout << "Q.프로그램 종료(q/Q)" <<endl;
      cout << "원하는 작업의 번호를 입력하세요: ";
   cout << endl;
 
   char select;
   cin>> select;
 

   switch(select)
   {
   case '1' :
    { 
     ret = add_student;
              flag = true;
    break;
    }
   case '2' :
    { 
     ret = del_student;
              flag = true;
    break;
    }
      case '3' :
    { 
     ret = n_student;
      flag = true;
    break;
    }


       case '4' :
    { 
     ret =s_student;
      flag = true;
    break;
    }
       case '5' :
    { 
     ret =c_student;
      flag = true;
    break;
    }

   case  '6' :
    {
             ret = show_all;
    flag = true;
    break;
    }
   case 'q' :
   case 'Q' :
    {
     ret = quit;
     flag = true;
    break;
    }

   default :
    cout << "올바르지 않은 입력입니다." << endl;
    break;
   }
  
   if(flag==true)
   {
    break;
   }
  
   }

  return ret;
 
}

//
// bool Mystrcmp(char x[], char y[]) // 문자열 비교함수(전지훈 선배의 조언!)
//
//{
// int a, b;
//
// bool ret;
//
// for(a=0; x[a] != '\0'; a++);  // 널이 아닐때까지 루프 돌기
//
// for(b=0; y[b] != '\0'; b++);  // 널이 아닐때까지 루프 돌기
//
// if( a < b)        
// {
//  for(int k = 0 ; k <= b; k++)
//
//  {
//   if(x[k] != y[k])       // 같지 않을 때
//   {
//    ret = false;
//    return ret;
//   }
//  }
//  ret = true;
//  return ret;
// }
// else
// {
//  for(int k = 0 ; k <= a; k++)
//  {
//   if(x[k] != y[k])       // 같지 않을 때
//   {
//    ret = false;
//   return ret;
//   }
//  }
//  ret = true;
//  return ret;
// }
//}

void namechcak(student *sp, int num)
{
  for(int i=0; i<num; i++)
 {
 
     if(strcmp((sp+i+1)->name, (sp+i)->name)==0)   //// 입력 받은 내용을 strcmp(a,b)==0를 이용하여 문자 비교
  {
   cout << "이름이 중복 데이터는 다음과 같습니다." <<endl;   // 0 이라면 출력
      cout << (sp+i)->name << setw(5) << (sp+i)->s << setw(5) << (sp+i)->y << setw(5) <<(sp+i)->c <<endl;   // 0 이라면 출력
            cout << endl; 
  }
 }
 
}

void c_chcak(student *sp, int num)
{
  for(int i=0; i<num; i++)
 {
     if(strcmp((sp+i+1)->c, (sp+i)->c)==0)     // 입력 받은 내용을 strcmp(a,b)==0를 이용하여 문자 비교
  {
   cout << "도시가 중복 데이터는 다음과 같습니다." <<endl;      // 0 이라면 출력
   cout << (sp+i)->name << setw(5) << (sp+i)->s << setw(5) << (sp+i)->y << setw(5) <<(sp+i)->c <<endl;   // 0 이라면 출력
            cout << endl;  
  }
 }
 
}

 

bool addStudent(student *sp, int maxsize, int &num)
{
  bool ret;


 if(num >= maxsize)         // 할당된 크기보다 num이 클경우
 {
  cout << maxsize << "명까지의 성적만 받습니다."<<endl;
 ret = false;
 }

 else
 {
     //포인터를 이용하되 포인터 값의 변경없이 입력받기 (화살표사용)


  cout << num << "번 학생의"<< endl;

  cout <<"-----1. 이름 입력-----"<<endl;
     cin >> (sp+num)->name;

  cout << "-----2. 성별(남(m,M)/여(F,f))입력-----"<<endl;
  cin >> (sp+num)->s;

  cout <<"-----3. 나이 입력-----" <<endl;
  cin >> (sp+num)->y;

  cout <<"-----4. 출생지 입력-----"<<endl;
  cin >> (sp+num)->c;
 

  num++;

     ret = true;
 }
 
 return ret;
}


bool delStudent(student *sp, int maxsize, int &num)   //선택삭제 및 중복 삭제
{
  bool ret;
  char name[20];
  student temp;

  cout << "삭제하고 싶은 사람의 이름 : ";
 cin>> name;
  

 for(int i=0;i< maxsize;i++)                      
 {
  if(strcmp(name, (sp+i)->name)==0)              //// 입력 받은 내용을 strcmp(a,b)==0를 이용하여 문자 비교
  {
   for(int k=i;k<num;k++)
   {
    temp = sp[i];       //삭제할 내용을 temp로 빼고 그 뒤에 있는 내용을 앞으로 올림.
 sp[i] =sp[i+1]; 
   }
    cout << "삭제 되었습니다."<<endl;

    num--;             //올라온 뒷자리를 없어지게 함.
  }
 
 }
 
     ret = true;

   return ret;
}

void n1_student(student *sp,int num)
{
 char name[20];

 cout << "찾고자 하는 이름 : ";
 cin>> name;
   
   
 for(int i=0; i<num; i++)
 {
 

  if(strcmp(name, (sp+i)->name)==0)    //  입력 받은 내용을 strcmp(a,b)==0를 이용하여 문자 비교
  {

   cout << (sp+i)->name << setw(5) << (sp+i)->s << setw(5) << (sp+i)->y << setw(5) <<(sp+i)->c <<endl; // 0 이라면 출력
  }
 
 
 
 }


}


void s1_student(student *sp,int num)
{
 
 float f=0;
 float m=0;
 float tf=0.00;
 float tm=0.00;

for(int i=0; i<num; i++)
{
 if(sp[i].s=='f' || sp[i].s=='F')    // f또는 F 일때
  {
   f++;   // 중복 수만큼 증가
          //cout << (sp+i)->name << setw(5) << (sp+i)->s << setw(5) << (sp+i)->y << setw(5) <<(sp+i)->c <<endl;
  }
 if(sp[i].s=='m' || sp[i].s=='M')     // m또는 M 일때
  {
   m++;   // 중복 수만큼 증가
          //cout << (sp+i)->name << setw(5) << (sp+i)->s << setw(5) << (sp+i)->y << setw(5) <<(sp+i)->c <<endl;
  }

}

 tf=(f/(f+m))*100;    //여자비율
 tm=(m/(m+f))*100;    //남자 비율


 cout << "여성 : 남성 "<< tf <<':'<< tm <<endl;

}

void c1_student(student *sp,int num)
{
  char cs[20];
  int count=0;

  cout << "찾고자 하는 출생지는?? : ";
  cin>> cs;
 
 for(int i=0; i<num; i++)
 {
   
  if(strcmp(cs, (sp+i)->c)==0)   
  {
   count++;  //중복 수 만큼 증가
    
         // cout << (sp+i)->name << setw(5) << (sp+i)->s << setw(5) << (sp+i)->y << setw(5) <<(sp+i)->c <<endl;
  }
 }
  cout << "도시,"<< cs <<"의 거주자 수 :" << count <<endl;
}

void showall(student *sp, int num)
{
 cout.precision(2);
 cout << fixed;
 cout <<setw(5) <<" ________전체 표시_______"<<endl;
    cout <<setw(5) <<" 번호 이름 성별 연령 출생지"<<endl;

 for(int i=0; i< num; i++)
 {
  //포인터의 증가를 이용하여 입력받기
  cout <<setw(5) <<i+1 << setw(5) << sp->name << setw(5) << sp->s << setw(5) << sp->y << setw(5) << sp->c <<endl;
  sp++;
 
 }
 cout <<setw(5) <<" _________________________"<<endl;
}

 

 


 

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

C# 채팅 프로그램(Server 확장)  (4) 2012.03.07
C# 채팅 프로그램(Client)  (0) 2012.03.07
선택정렬응용  (0) 2012.03.07
이름정렬  (0) 2012.03.07
링크드리스트(Linked list)  (0) 2012.03.07
이진탐색+Recrusion (되부름 알고리즘)  (0) 2012.03.07
C# 채팅 프로그램(Server)  (2) 2012.03.06
Update Instructions - Mango Beta 2 for WPDevs - 2.0  (0) 2011.08.22
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,

 

링크드리스트(Linked list)

 

 

 

fire 첫 번째 숙제

링크리스트.

 

1->2->3->23->20

 

입력 받음과 동시에 정렬해버리고

연결연결~

 

#include <iostream>
using namespace std;

struct Foo { /* 리스트 구조체 */
 int data;
 Foo *p;
};

Foo *p1; /* 리스트의 시작을 가리키는 헤더 노드 */

void In(int num); /* 노드 삽입 */
bool Del(int num);/* 노드 제거 */
void out(); /* 리스트 순회 */


int main()
{
 
 int num;
 bool res;
 bool flag=false;

 while (true) {


  cout << "\n"<<endl;
  cout << "1. 한개의 수를 입력하기!!"<<endl;
  cout << "2. 한개의 수를 제거하기!!"<<endl;
  cout << "3. 링크해서 출력하기"<<endl;
  cout << "Q. 종료하기." << endl;
  char s;
  cin>> s;
 
  switch(s)
  { /* 선택한 메뉴에 따른 연산 */
  case '1':
   cout <<"데이터를 입력하세요!! : "<< endl;
    cin>> num;
  
 In(num);

    cout <<"입력되었습니다.\n"<< endl;
   break;
 
  case '2':
  
   cout << "삭제할 데이터를 입력하세요"<<endl;
      cin >> num;

   res= Del(num);

   if(res == true)
   {
     cout << "삭제되었습니다." <<endl;
   }
   else
   {
     cout << num <<"(은/는) 찾지못하였습니다."<<endl;
   }
   break;

  case '3':
 
   out();
       break;
  case 'q':
  case 'Q':
   cout << "프로그램을 종료합니다." << endl;
  
  flag = true;
  break;
  default :
   cout << "잘못입력하셨습니다" <<endl;
   
 
  }
  if(flag == true)
  {
   break;
  }
 }

}


void In(int num) // 노드 삽입
{
 Foo *current=p1; // 노드의 처음부터 검색
 
 Foo *prev=NULL;
 
 Foo *newNode = new Foo; // 삽입한 노드의 메모리 할당
 
 newNode->data = num; // 자료 저장

 

 /* 자료를 오름차순으로 정렬하며 포인터를 이용하여 정렬하는 위치를 찾아감 */
 
 while (current != NULL && num > current->data) { // 노드의 끝이거나, 자료의 위치를 찾으면 검색 종료
  prev = current; // 현재 위치를 prev에 저장
  current = current->p; // 다음 노드로 넘어감
 }

 if (prev == NULL) { // Header 노드가 비었을 경우 (while 을 한번도 안거쳤을 경우)
  p1 = newNode; // 노드의 시작을 삽입한 노드로 변경 //
 }
 else {
  prev->p = newNode; // 삽입 위치가 처음이 아니라면 이전 노드의 다음 노드를 현재노드로 변경
 }

 newNode->p = current; // 삽입한 노드의 다음 노드를 현재 위치로 저장
}


bool Del(int num)
{
  Foo *current = p1;
  Foo *prev=NULL;

  if(current == NULL)
  {
    return false;         //비어 있다면 삭제 실패
  }
 
  while(current != NULL && num != current->data)
  {
   prev = current;

   current = current->p;
 
  }

  if(current == NULL)
  {
   return false;        //끝까지 검색한 후 삭제 실패
  }

  if(prev == NULL)
  {
   p1=current ->p; // 찾을 위치가 처음인 경우
  }
  else // 처음이 아닌 경우
  {
   prev->p = current ->p;  // 삭제할 노드의 링크 제거(이전 노드의 링크를 다음 노드로 연결)
  }
 


  delete [] current;
 
  return true;
 


}

 

void out() // 리스트 순회
{
 Foo *current = p1; // 리스트의 처음부터 검색
 

 while (current != NULL ) { // 리스트의 끝까지 검색
 
 

  cout<<""<<current->data;  // 출력
 
  if (current->p != NULL)  cout<<" -> ";
     
  current = current->p; // 다음 노드로 넘어감 */
 }
}

블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,

이진탐색+Recrusion (되부름 알고리즘)

 

 

#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_Recursive(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]);
//
//}



bool bi_Recursive(int list[], int end, int target, int & locn)
{
int first=0, mid, last=end;
mid=(first+last)/2;

if(first<=last)
{
if(target == list[mid])
{
return (target == list[mid]);
}
else if(target>list[mid])
{
first=mid+1;
bi_Recursive(list,mid,first,locn);
}
else if(target<list[mid])
{
last=mid-1;
bi_Recursive(list,last,mid,locn);
}

}

locn=mid;

}
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,


C# 채팅 프로그램(Server)
 


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.IO;

using System.Net;

using System.Net.Sockets;

using System.Threading;


namespace Ex_chatserver

{

    public partial class MainForm : Form

    {


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


        public MainForm()

        {

            InitializeComponent();

        }


        private void Form1_Load(object sender, EventArgs e) //form1이 로드되면서 시작.

        {

            //서버를 시작

            Thread t1 = new Thread(new ThreadStart(StartListen));

            t1.Start();


        }

        


        private void StartListen()

        {

            IPAddress addr = new IPAddress(long.Parse("127.0.0.1")); //ip주소받기

            TcpListener Server = new TcpListener(addr, 8080);


            AddTextDelegate AddText = new AddTextDelegate(txtClient.AppendText);


            String MessageStr = "안녕하세요, 서버에서 보냅니다.";


            Server.Start();//연결요청 대기시작


            Invoke(AddText, "Listening을 시작합니다..\r\n");


            TcpClient Client = Server.AcceptTcpClient();//연결요청수락

            Invoke(AddText, "Client와 연결되었습니다..\r\n");


            NetworkStream stream = Client.GetStream();//NetWorkStream 얻기


            StreamWriter writer = new StreamWriter(stream);//메시지 보내기

            writer.WriteLine(MessageStr);

            writer.Flush();

            Invoke(AddText, "Client에 메시지를 보냈습니다..\r\n");


            Client.Close();//연결닫기

            Server.Stop();

            Invoke(AddText, "서버와 연결 종료..\r\n");


            //TcpListener는 Client의 요청에 귀기울(Listen)이고 있다가 Client가 연결을 요청해오면(Connect) Client의 연결요청을 수락(AcceptTcpClient)합니다.

            //여기까지 진행되고 나면 실제 데이터를 주고 받는 통신은 NetWorkStream을 통해서 이루어짐.

        }

       

    }

}



참고자료
 

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


블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,



안녕하세요!!

약간의 교육과 여행으로 인하여 잠시 쉬고 있었습니다.
돌아와서 보니, 다시 비가 내리고 있네요;;;

폭우로;;;

8월도 이제는 얼마 남지 않았습니다.
시간 참 빠르게 흘러가고 있습니다.

-운명을 바꾸는자-






(윈도우7폰 망고가 없을 경우에는 에뮬을 이용하자.)

(윈도우7폰 망고가 있을 경우)
윈도우 개발 툴인 Mango Beta 2를 설치한 뒤, 본격적인 개발에 앞서 최신 버전으로 업데이트를 해주어야 합니다.


현재 최신버전은 7712버전입니다.

-Zune 프로그램-



업데이트를 하기전 주위사항.

1. 윈도우7폰 망고에 있는 데이터를 백업시켜주세요.
2. 기존에 업데이트를 하다가 실패했을 경우, 업데이트에 필요한 설치 파일들을 모두 삭제해주세요.
3. (추가) 에러로 인하여 윈도우7폰의 초기화가 필요할 경우가 발생할 수 있음. 



 Mango Beta 2 설치 이후, win7-phone을 개발하기 위해서 최신 버전으로 업데이트를 해주어야합니다.


필요한 기기 또는 소프트웨어 
 


1. 윈도우7폰 망고(업데이트)



2. 업데이트를 위한 파일들

a. MangoB2Refresh-ZuneClient.zip – Archive file that contains the pre-release Zune Client 4.8, required to update your Windows Phone retail device
-ZuneClient 설치하기.(윈도우폰이 컴퓨터에 연결될 수 있도록 도와줌.)
 
b. MangoB2Refresh-UpdateWP.zip – Archive that contains the program that will update your Windows Phone to point to the new server
-Update를 위해서 컴퓨터버전에 따라서 먼저 설치해줘야함.(X86, X64)

c. MangoB2-DevRetailUpdate.exe – Tool that will update your phone to receive the ‘Mango’ update from the test servers
-실제 업데이트 시작.
 
(파일들은 Microsoft에서 구할 것)
 




3. Zune 프로그램






4. 윈도우7폰 등록하기
 


윈도우7폰 개발툴 설치에 성공했다면, 실행파일이 존재함.



준비가 되었다면 본격적으로 업데이트를 시작합니다.

이번 업데이트를 위해서 참고한 PDF입니다.

아직은 한글버전이 없고, 영문버전이기 때문에 
제가 경험했던 방식을 순서대로 작성하도록 하겠습니다.







"윈도우7폰 망고" 최신버전(현재 최신버전7712)으로 업데이트하기
2011.08.21



1. App Hub 가입
 



앱허브에 가입하는 것은 따로 설명하지 않겠습니다.

http://create.msdn.com/ko-KR/



2. Zune 설치하기 
 


Zune을 설치하기 위해서는 윈도우7폰을 컴퓨터에 연결한 상태가 되면 않됩니다.

윈도우7폰과 컴퓨터의 연결해제 후에 설치를 시작하도록 하자.


 
설치가 끝나면 이러한 아이콘과 프로그램을 실행시킬 수 있습니다.
 

 

3. Zune-> 설정-> 전화-> 업데이트(7403버전까지) 



사진을 보게 되면 버전이 이미 최신버전으로 되어있습니다.
사진은 참고만 하시고, 버전이 낮다면 업데이트 버튼이 보일 것입니다.

버튼을 누르게되면 아래 사진과 같이 업데이트가 시작됩니다.

(주의) 절대 업데이트 중에 윈도우7폰과 컴퓨터의 연결을 해제하지 마세요!! 




 
4. Windows Phone Developer Registration에서 등록한다.



윈도우7폰 개발 툴을 설치했다면 실행파일을 찾기 쉬울 것입니다.

등록하기 위해서는

1. 윈도우7폰과 컴퓨터를 연결하고
2. Zune을 통하여 동기화 시켜줍니다.
3. 다음 이 프로그램을 실행 시켜주면 등록할 수 있는 상태가 됩니다.

(참고) 계속해서 사진과 같은 상태가 된다면, 윈도우7폰을 재부팅한 뒤 다시 연결해보세요!
 
 
 

 
5. MangoB2-DevRetailUpdate.exe를 실행하기 위해서 먼저 MangoB2Refresh-UpdateWP.zip 파일 중 자신의 컴퓨터에 해당하는 파일을 실행하자.


 자신의 컴퓨터에 해당하는 프로그램을 
MangoB2-DevRetailUpdate.exe를 실행시키기 전에 먼저 설치해야됩니다.
설치시에 큰 문제점은 없을 것입니다. 

 

6. MangoB2-DevRetailUpdate.exe를 실행하자
 

해당 프로그램을 실행하게 되면 이러한 UI들을 볼 수 있습니다.

실행하기 전 Zune을 껴주세요.

동의를 누르신뒤에...
 



설치가 끝날 때까지 기다리시면 됩니다.
설치가 끝날 때 아래와 같은 메시지가 보이게 될것입니다. 




메시지를 확인한뒤 설치 프로그램을 닫습니다.
그 후 Zune을 다시 실행 시켜주세요. 

 

 

7. MangoB2-DevRetailUpdate.exe실행이 끝나면 다시 Zune->설정->전화->업데이트에서 최신버전으로 업데이트하자.
 



다시 업데이트를 하는 곳으로 오게 되면 새로운 업데이트를 할 수 있도록 변경되어 있습니다.

업데이트를 실행하시면 됩니다.

(주의)만약 이곳에오게 되었는데 에러가 발생한다면 윈도우7폰을 재부팅한 뒤 다시 연결해주세요.


 

8. 7712버전 업데이트 성공.


7번까지 모두 수행하였다면 최신 버전으로 업데이트가 되었다는 것을 알 수 있습니다.

1. 윈도우7폰을 통해서



2. Zune을 통해서
 






참고자료

 Update Instructions - Mango Beta 2 for WPDevs - 2.0.PDF

* 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' 카테고리의 다른 글

C# 채팅 프로그램(Client)  (0) 2012.03.07
선택정렬응용  (0) 2012.03.07
이름정렬  (0) 2012.03.07
링크드리스트를 이용한 학생관리Pro  (0) 2012.03.07
링크드리스트(Linked list)  (0) 2012.03.07
이진탐색+Recrusion (되부름 알고리즘)  (0) 2012.03.07
C# 채팅 프로그램(Server)  (2) 2012.03.06
Windows Phone SDK 7.1 Beta 2 설치하기  (0) 2011.08.15
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,