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

 C, C++, C#, JAVA, Python, R, HTML등의 다양한 IT 언어들이 만들어지고 사용되고 있는 시대에 살고 있다. 과거에는 영어, 스페인어, 중국어 등의 사람간의 대화를 위한 언어들에 집중 했다면 많은 소프트웨어의 개발과 자동화 작업으로 인하여 개발언어를 배우는 것은 자연스러운 일이 되어가고 있으며 초,중,고 정규 과정에서도 수업을 할정도로 중요해지고 있다.

 과거에는 이과에서도 컴퓨터 공학관련 학과에서만 개발언어에 대하여 공부하였으나 이제는 문과 이과 관계없이 모두 개발 언어를 공부하며 다양한 수익 창출을 발생시키고 있는 상황이다. 많은 유료 코딩 강의를 통하여  C언어, 자바, 파이썬 등의 언어를 과거에는 공부하였는데 요즘은 유튜브를 통하여 무료로 실력 좋은 분들이 무료로 강의를 많이 해주고 있어서 주요 사이트를 공유하려한다. 

 

무료 개발 언어공부, 코딩공부 유튜브 TOP5

 

1. 조코딩 22

- 코딩과 전혀 관련 없는 학과를 나와서 코딩공부를 시작한 분으로 문과생도 보고 따라할수 있을 정도로 강의 수준을 낮추어 코딩에 대한 이해를 시켜주고 있으며 실제로 단계별 강의와 실용성 있는 개발 소스 공유를 통하여 처음 코딩을 접하는 사람도 따라할수 있도록 좋은 자료를 공유하고 설명해주고 있다.

www.youtube.com/watch?v=k0FJeq5Uo_I

2. 생활코딩 22

- 생활코딩은 조코딩 보다 조금더 개발자적 성향으로 들어가서 실질적으로 생활 속에서 일반인들이 코딩을 쉽게 접할수 있도록 다양한 유형의 개발 언어 강의를 해주고 있다.

www.youtube.com/watch?v=1ttLx9MbrCI

 

3. 노마드 코더 23.8

- 노마드 코더는 컨텐츠가 외국인이 진행하는 개발에 대한 이야기로 한국어와 영어를 같이 들을수 있으며 자막이 있어 개발에 대한 이해를 하는데 큰 어려움 없이 참고해볼수 있다. 한국과 외국의 개발에 대한 이야기와 기술이 대한 설명을 들을수 있다.

www.youtube.com/watch?v=zGrTT4k1-yc

 

4. 나도코딩 13.7  

- 나도 코딩은 코딩을 쉽고 재미있게 일반인들이 시작할수 있도록 기초에서 부터 다양한 예제를 제공하여 내가 개발한 내역을 바로 시각적으로 확인하고 접할수 있도록 다양한 컨텐츠를 제공하고 있다. 

www.youtube.com/watch?v=kWiCuklohdY

 

5. 테크보이 워니 13.3

- 실리콘밸리 출신의 개발자로써 미국의 개발환경과 기술에 대하여 설명해주며, 개발에 대한 고찰과 테크트리등에 대한 실질적인 개발자로써의 다양한 경험에 대하여 이야기해주고 있다. 또한 기본적인 개발언어에 대한 기술공유 컨텐츠를 제공하고 있다.

www.youtube.com/watch?v=2q28JQ6SNSs

 

#코딩이란코딩 배우기코딩 자격증코딩 장난감뽀로로 코딩컴퓨터코딩 노트북코딩 프로그램코딩 독학코디엠코딩컴퓨터코디엠 주가코딩 교육코딩 교육이란코디엠 주가 전망코딩 로봇코딩파티코딩 학원코디아이코디엠 거래정지 이유코디오반정코딩테스트코딩도장코딩 사이트

#마이크로스테이션 개발 언어소프트웨어 개발 언어개발 언어안드로이드 개발언어웹개발 언어앱 개발 언어언어 교육과정 개발웹 개발언어개발 언어 종류개발 언어 xm응용 프로그램 개발 언어

#Free IT development language study, coding study YouTube TOP5

#Estudio de lenguaje de desarrollo de TI gratuito, estudio de codificación YouTube TOP5

#無料IT開発言語研究では、符号化の研究ユーチューブTOP5

#免费的IT开发语言研究,编码研究YouTube TOP5

#मुफ्त आईटी विकास भाषा का अध्ययन, कोडिंग का अध्ययन YouTube TOP5

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

heapSort  (0) 2012.04.04
selectionSort  (0) 2012.04.04
shellSort  (0) 2012.04.04
오픈 API를 이용한 간단한 번역프로그램  (0) 2012.03.29
ChatClient  (0) 2012.03.29
MultiChatServer  (0) 2012.03.29
MultiChatClient  (0) 2012.03.29
큐를 이용한 간단한 구직Pro  (0) 2012.03.29
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,

heapSort

1. IT Story/Development 2012. 4. 4. 15:51



heapSort

#include<iostream>
#include<iomanip>
#include "maxHeap.h"
using namespace std;

#define MAX_ARY 15


void heapSort(int list[], int last);

int main()
{

 int ary[MAX_ARY]={12,12,23,54,67,43,67,87,56,4,3,2,54,67,9};


 cout << "before sort"<<endl;

 for(int i=0; i<MAX_ARY; i++)
 {
  cout<<setw(3)<<ary[i];
 }

 cout<<endl;

 cout<<"after heap sort"<<endl;

 heapSort(ary, MAX_ARY-1);

 for(int i=0; i<MAX_ARY; i++)
 {
  cout<<setw(3)<<ary[i];
 }
 cout<<endl;

}

void heapSort(int list[], int last)
{
 int sorted;//index
 int hold;
 int walker;
 //heap building 하기

 for(walker=1; walker <= last; walker++)
 {
  reheapUp(list, walker);
 }
 //sort

 int pass=1;


 sorted = last;
 while(sorted >0)
 {
  hold=list[0];
  list[0] = list[sorted];
  list[sorted]=hold;
  sorted--;
  reheapDown(list, 0, sorted);

  cout<<"PASS"<<pass++<<":";
  for(int i=0; i<MAX_ARY; i++)
  {
  cout<<setw(3)<<list[i];
  }
  cout<<endl;
 }
}

 

 

#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;
}

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

무료 IT 개발 언어공부, 코딩공부 유튜브 TOP5  (0) 2021.01.26
selectionSort  (0) 2012.04.04
shellSort  (0) 2012.04.04
오픈 API를 이용한 간단한 번역프로그램  (0) 2012.03.29
ChatClient  (0) 2012.03.29
MultiChatServer  (0) 2012.03.29
MultiChatClient  (0) 2012.03.29
큐를 이용한 간단한 구직Pro  (0) 2012.03.29
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,



selectionSort

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

#define MAX_ARY 15


void selectionSort(int list[], int last);

int main()
{

 int ary[MAX_ARY]={12,12,23,54,67,43,67,87,56,4,3,2,54,67,9};


 cout << "before sort"<<endl;

 for(int i=0; i<MAX_ARY; i++)
 {
  cout<<setw(3)<<ary[i];
 }

 cout<<endl;

 cout<<"after selection sort"<<endl;

 selectionSort(ary, MAX_ARY-1);

 for(int i=0; i<MAX_ARY; i++)
 {
  cout<<setw(3)<<ary[i];
 }
 cout<<endl;

}

void selectionSort(int list[], int last)
{
 int current;
 int smallest; 
 int hold;
 int walker;

 for(current = 0; current < last; current++)
 {
  smallest=current;
  
  for(walker = current +1; walker<=last; walker++)
  {
   if(list[walker]< list[smallest])
   {
    smallest = walker;
   }
  }//for
  //최소값이 선택됨. 현재요소와 교환
  hold = list[current];
  list[current] = list[smallest];
  list[smallest] = hold;
  cout<<"PASS"<< current+1<<":";
  for(int i=0; i<MAX_ARY; i++)
  {
  cout<<setw(3)<<list[i];
  }
  cout<<endl;
 }
}

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

무료 IT 개발 언어공부, 코딩공부 유튜브 TOP5  (0) 2021.01.26
heapSort  (0) 2012.04.04
shellSort  (0) 2012.04.04
오픈 API를 이용한 간단한 번역프로그램  (0) 2012.03.29
ChatClient  (0) 2012.03.29
MultiChatServer  (0) 2012.03.29
MultiChatClient  (0) 2012.03.29
큐를 이용한 간단한 구직Pro  (0) 2012.03.29
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,


shellSort

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



#define MAX_ARY 15

void shellSort(int list[], int last);

int main()
{

 int ary[MAX_ARY]={12,12,23,54,67,43,67,87,56,4,3,2,54,67,9};


 cout << "before sort"<<endl;

 for(int i=0; i<MAX_ARY; i++)
 {
  cout<<setw(3)<<ary[i];
 }

 cout<<endl;

 cout<<"after sort"<<endl;

 shellSort(ary, MAX_ARY-1);

 for(int i=0; i<MAX_ARY; i++)
 {
  cout<<setw(3)<<ary[i];
 }
 cout<<endl;

}

void shellSort(int list[], int last)
{
 int hold;
 int incre;
 int curr;
 int walker;
 incre = last /2;
 int pass =1;

 while(incre != 0)
 {
  for(curr=incre; curr<=last; curr++)
  {
   hold = list[curr];
   walker = curr - incre;

   while(walker>=0 && hold < list[walker])
   {
    list[walker + incre] = list[walker];
    walker = walker - incre;
   }//while(walker>=0 && hold < list[walker])
   list[walker + incre] = hold;
  }//for
  //pass출력하기
  
  cout<<"PASS"<<pass++<<"("<<incre<<")"<<":";

  for(int i=0; i<MAX_ARY; i++)
  {
   cout<<setw(3)<<list[i];
  }
  cout<<endl;

  incre=incre/2;

 }//while(incre!=0)
 
}

 

 

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

무료 IT 개발 언어공부, 코딩공부 유튜브 TOP5  (0) 2021.01.26
heapSort  (0) 2012.04.04
selectionSort  (0) 2012.04.04
오픈 API를 이용한 간단한 번역프로그램  (0) 2012.03.29
ChatClient  (0) 2012.03.29
MultiChatServer  (0) 2012.03.29
MultiChatClient  (0) 2012.03.29
큐를 이용한 간단한 구직Pro  (0) 2012.03.29
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,

오픈 API를 이용한 간단한 번역프로그램

 

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.IO;
using System.Xml;

namespace translator
{
    public partial class Form1 : Form
    {
        const string AppId = "오픈API 인증코드 얻으세요!";

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.comboBox1.Items.Add("ko"); //콤보박스에 아이템추가
            this.comboBox1.Items.Add("en");

            this.comboBox2.Items.Add("ko");
            this.comboBox2.Items.Add("en");

            this.comboBox1.SelectedIndex = 0; //0번째 요소 꺼내오기
            this.comboBox2.SelectedIndex = 1;

        }
        private void button1_Click_1(object sender, EventArgs e)
        {
            //웹으로부터 값을 받아오기 위해서 선언       번역할 한글            현재 형태                               번역할 형태
            HttpWebRequest request = BuildRequest(this.textBox.Text, this.comboBox1.SelectedItem.ToString(), this.comboBox2.SelectedItem.ToString());

            try
            {
                // 요청에 응답했을경우~
                HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // 리소스를 받아옵니다.
                this.textBox1.Text = DisplayResponse(response); // 리소스를 번역된 창에 뿌려줌 그전에...DisplayResponse(response)으로 고고~
            }
            catch (WebException ex)
            {
                // 응답하지 않았을경우!, 네트워크문제~
                Console.WriteLine(ex.Message);
            }
        }

        public static HttpWebRequest BuildRequest(string str, string SourceLanguage, string TargetLanguage) //번역할 값, 현재 언어, 번역될 언어
        {
            string requestString = "http://api.bing.net/xml.aspx?" // open API에서 xml 받아와서 필요한 태그만 씀

                // 공통된 요청필드들.. (필수!)
                + "AppId=" + AppId 
                + "&Query=" + str
                + "&Sources=Translation"

                // 공통된 요청필드들.. (선택적으로)
                + "&Version=2.2"

                // 특정소스타입 가져오기 (필수!!) // 우리에게 필요한건 번역을 담당하는 부분
                + "&Translation.SourceLanguage=" + SourceLanguage
                + "&Translation.TargetLanguage=" + TargetLanguage;

          
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestString);  // 요청을 생성하고 초기화

            return request;
        }

        static string DisplayResponse(HttpWebResponse response)
        {
            // XmlDocument로 응답을 로드함.
            XmlDocument document = new XmlDocument();
            document.Load(response.GetResponseStream());

            //namespace 관리자에 대해서 네임스페이스 추가
            XmlNamespaceManager nsmgr = new XmlNamespaceManager(document.NameTable); //XmlNamespaceManager 를통한 xml 파싱 변환작업 
                                                                                        //yweather:forecast  --> ":"
            nsmgr.AddNamespace(
                "api", //api의 값을 파싱하기위해서
                "http://schemas.microsoft.com/LiveSearch/2008/04/XML/element");

            XmlNodeList errors = document.DocumentElement.SelectNodes(  //에러가 발생할 경우
                "./api:Errors/api:Error",
                nsmgr);

            string result = string.Empty; // " "

            if (errors.Count > 0)
            {
                // 에러가 발생했을 경우
                DisplayErrors(errors);
            }
            else
            {
                // 에러가 발생하지 않을 경우 값을 result에 넣자~
                result = DisplayResults(document.DocumentElement, nsmgr);//document.DocumentElement 페이지를 옴겨다닐때 기본요소들의 값을 가져오기 위해서, 파싱데이터
            }
            return result;
        }


        static string DisplayResults(XmlNode root, XmlNamespaceManager nsmgr)
        {
            string version = root.SelectSingleNode("./@Version", nsmgr).InnerText; // 버전과 파싱받은 값  InnerText: 시작태그와 종료태그 사이의 값을 가져옴
            string searchTerms = root.SelectSingleNode( //SelectSingleNode 패턴과 일치하는 제일 첫번째의 값을 가저온다.
                "./api:Query/api:SearchTerms",
                nsmgr).InnerText;

            // 결과를 헤더에 표시
            Console.WriteLine("Bing API Version " + version);
            Console.WriteLine("Translation results for " + searchTerms);
            Console.WriteLine();

            // 네임스페이스 관리자 안에 네임스페이스 Translation SourceType 추가
            nsmgr.AddNamespace(
                "tra", //tra의 값을 파싱해가기위해서
                "http://schemas.microsoft.com/LiveSearch/2008/04/XML/translation");


            XmlNodeList results = root.SelectNodes( //드디어 변역된 값을 받아 오기 위한 실질적인 태그를 가저옴
                "./tra:Translation/tra:Results/tra:TranslationResult",
                nsmgr);

            // Display the Translation results.
            string MsgResult = string.Empty;//""

            foreach (XmlNode result in results)
            {

                MsgResult = result.SelectSingleNode("./tra:TranslatedTerm", nsmgr).InnerText;  // 변역된 값을 받아와서
            }
            return MsgResult; //리턴해줌
        }
        static void DisplayErrors(XmlNodeList errors)
        {
            // Iterate over the list of errors and display error details.
            Console.WriteLine("Errors:");
            Console.WriteLine();
            foreach (XmlNode error in errors)
            {
                foreach (XmlNode detail in error.ChildNodes)
                {
                    Console.WriteLine(detail.Name + ": " + detail.InnerText);
                }

                Console.WriteLine();
            }
        }

    }
}

 

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

무료 IT 개발 언어공부, 코딩공부 유튜브 TOP5  (0) 2021.01.26
heapSort  (0) 2012.04.04
selectionSort  (0) 2012.04.04
shellSort  (0) 2012.04.04
ChatClient  (0) 2012.03.29
MultiChatServer  (0) 2012.03.29
MultiChatClient  (0) 2012.03.29
큐를 이용한 간단한 구직Pro  (0) 2012.03.29
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,

ChatClient

1. IT Story/Development 2012. 3. 29. 11:40

 

ChatClient

 

package exam.Chat;
import java.io.*;
import java.net.*;

import android.app.Activity;
import android.os.*;
import android.view.*;
import android.widget.*;


public class ChatClient extends Activity {
 View page1,page2; // 로그인과 로그아웃에 따라 페이지 전환
 TextView txtid,txtloginid; //로그인, 로그아웃시에 보여질 텍스트뷰
 EditText txtmid,txtsend; // 로그인, 로그아웃시에 보여질 입력창
 
 String ip; // ip 값을 받기
 Socket socket; // 소캣을 이용
 
 // 입출력 스트림
 BufferedReader inMsg;
 PrintWriter outMsg;
 
 mThread thread; //멀티스래드
 
 boolean status; // 현재상태
 
 String msg;     //메시지 담기
 String[] rmsg; //현재 로그인인지 아닌지에 대한 값을 받음
 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main); //main 레이아웃을 가져옴       
       
        //각각의 레이아웃(페이지, 텍스트뷰 버튼 등..)의 위치 확인
        page1=findViewById(R.id.page1);
        page2=findViewById(R.id.page2);
        txtid=(TextView)findViewById(R.id.txtid);      
        txtsend=(EditText)findViewById(R.id.txtsend);
        txtloginid=(TextView)findViewById(R.id.txtloginid);
        txtmid=(EditText)findViewById(R.id.txtmid);
        findViewById(R.id.btnlogin).setOnClickListener(mClickListener);
        findViewById(R.id.btnlogout).setOnClickListener(mClickListener);
        findViewById(R.id.btnsend).setOnClickListener(mClickListener);
       
        ip="192.168.43.33";
       
    }
   
    Button.OnClickListener mClickListener = new Button.OnClickListener(){ //로그인 버튼을 눌렀을때
     public void connectServer(){
      try {
       
       socket = new Socket(ip,8888);  // 소캣이 할당되고
       
       txtmid.append("[Client]Server connected");  //연결성공시 화면에 출력, 자동으로 띄어씀(append)  
      
       inMsg = new BufferedReader(new InputStreamReader(socket.getInputStream(), "euc-kr")); //받아오는 메시지
       //outMsg = new PrintWriter(socket.getOutputStream(),true); // 입력을 통해 출력하는 메시지는 깨짐
       
       outMsg = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "euc-kr")),true);
      
       outMsg.println(txtid.getText()+"/"+"login"); // 로그인 확인 메시지
       
       
       thread = new mThread(); //멀티스래드 생성
       thread.start();   //스래드 실행
      }
      catch(Exception e) {         
       System.out.println("[MultiChatClient]connectServer() Exeption 발생");
      }
     }

     public void onClick(View v){
      
      switch(v.getId()){  
       case R.id.btnlogin:  //로그인 버튼을 눌렀을때
             page2.setVisibility(View.VISIBLE);
             page1.setVisibility(View.INVISIBLE);
             txtid.setText(txtloginid.getText());
           
             connectServer();
          
             break;
            
      case R.id.btnlogout:   //로그 아웃 버튼을 눌렀을때  
       page1.setVisibility(View.VISIBLE); 
           
          page2.setVisibility(View.INVISIBLE);
          txtloginid.setText("");
          txtloginid.setHint("id입력");
          txtmid.setText("");
          break;
      case R.id.btnsend:  //보내기 버튼을 눌렀을때
       
       outMsg.println(txtid.getText()+"/"+txtsend.getText());
       txtsend.setText("");
          break;
      }
     }
    };
    class mThread extends Thread{ 
     public void run() {
      
      status=true;
      
      while(status) {  //지금의 상태를 확인해서
       try{
        
        msg = inMsg.readLine(); //메시지를 읽고
        rmsg = msg.split("/");  // 띄어쓰기      
        mhandler.sendEmptyMessage(0); //핸들러를 통해서 메시지를 보냄
       }
       catch(IOException e) {        
        status = false;
       }
      }
      System.out.println("[MultiChatClient]"+thread.getName()+"종료됨");
      
     }
    }
    Handler mhandler = new Handler(){
     public void handleMessage(Message msg){
      if(msg.what==0){ //메시지의 의미를 설명, 의미가 정해져 있지는 않으며 핸들러별로 지역적으로 핸들러와 충돌할 위험이 없다.
       txtmid.append(rmsg[0]+">"+rmsg[1]+"\n");
      }
     }
    };
   
}

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

heapSort  (0) 2012.04.04
selectionSort  (0) 2012.04.04
shellSort  (0) 2012.04.04
오픈 API를 이용한 간단한 번역프로그램  (0) 2012.03.29
MultiChatServer  (0) 2012.03.29
MultiChatClient  (0) 2012.03.29
큐를 이용한 간단한 구직Pro  (0) 2012.03.29
queueADT를 이용한 간단한 응용프로그램  (0) 2012.03.29
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,

MultiChatServer

 

package com.chat.v5;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class MultiChatServer {

 // 서버 소켓 및 클라이언트 연결 소켓
 private ServerSocket  ss= null;
 private Socket s= null;
 
 // 연결된 클라이언트 스레드를 관리하기 위한 ArrayList
 ArrayList<ChatThread> chatlist = new ArrayList<ChatThread>();
 
 // 멀티챗 메인 프로그램 부
 public void start() {
  try {
   // 서버 소켓 생성
   ss = new ServerSocket(8888);
   System.out.println("server start");
   
   // 무한 루프를 돌면서 클라이언트 연결을 기다림
   while(true) {
    s=ss.accept();    
    // 연결된 클라이언트에 대해 쓰레드 클래스 생성
    ChatThread chat = new ChatThread();
    // 클라이언트 리스트 추가
    chatlist.add(chat);
    // 스레드 시작
    chat.start();
   }
  } catch (Exception e) {
   //System.out.println(e);
   System.out.println("[MultiChatServer]start() Exception 발생!!");
  }  
 }
 
 public static void main(String[] args){
  MultiChatServer server = new MultiChatServer();
  server.start();
 }
 
 // 연결된 모든 클라이언트에 메시지 중계
 void msgSendAll(String msg) {
  for(ChatThread ct : chatlist) {
   ct.outMsg.println(msg);
  }
 }

 // 각각의 클라이언트 관리를 위한 쓰레드 클래스
 class ChatThread extends Thread {
  // 수신 메시지 및 파싱 메시지 처리를 위한 변수 선언
  String msg;
  String[] rmsg;
  
  // 입출력 스트림
  private BufferedReader inMsg = null;
  private PrintWriter outMsg = null;

  public void run() {
  
   boolean status = true;
   System.out.println("##ChatThread start...");
   try {
    // 입출력 스트림 생성
    inMsg = new BufferedReader(new InputStreamReader(s.getInputStream()));
    outMsg = new PrintWriter(s.getOutputStream(),true);
    
    // 상태정보가 true 이면 루프를 돌면서 사용자로 부터 수신된 메시지 처리
    while(status) {
     // 수신된 메시지를 msg 변수에 저장
     msg = inMsg.readLine();
     // "/" 구분자를 기준으로 메시지를 문자열 배열로 파싱
     rmsg = msg.split("/");
     
     // 파싱된 문자열 배열의 두번째 요소 값에 따라 처리
     // 로그아웃 메시지 인 경우
     if(rmsg[1].equals("logout")) {
      chatlist.remove(this);
      msgSendAll("server/"+rmsg[0]+"님이 종료 했습니다.");
      // 해당 클라이언트 스레드 종료로 인해 status 를 false 로 설정
      status = false;
     }
     // 로그인 메시지 인 경우
     else if(rmsg[1].equals("login")) {
      msgSendAll("server/"+rmsg[0]+"님이 로그인 했습니다.");
     }
     // 그밖의 경우 즉 일반 메시지인 경우
     else {
      msgSendAll(msg);
     }
    }
    // 루프를 벗어나면 클라이언트 연결 종료 이므로 스레드 인터럽트
    this.interrupt();
    System.out.println("##"+this.getName()+"stop!!");
    
   } catch (IOException e) {
    chatlist.remove(this);
    //e.printStackTrace();
    System.out.println("[ChatThread]run() IOException 발생!!");
   }
  }
 }
}

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

selectionSort  (0) 2012.04.04
shellSort  (0) 2012.04.04
오픈 API를 이용한 간단한 번역프로그램  (0) 2012.03.29
ChatClient  (0) 2012.03.29
MultiChatClient  (0) 2012.03.29
큐를 이용한 간단한 구직Pro  (0) 2012.03.29
queueADT를 이용한 간단한 응용프로그램  (0) 2012.03.29
circularAry 큐를 사용하여 복사하기  (0) 2012.03.29
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,

 

MultiChatClient

 

package com.chat.v5;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class MultiChatClient implements ActionListener, Runnable{
 private String ip;
 private String id;
 private Socket socket;
 
 // 입출력 스트림
 private BufferedReader inMsg = null;
 private PrintWriter outMsg = null;

 // 로그인 패널
 private JPanel loginPanel;
 // 로그인 버튼
 private JButton loginButton;
 // 대화명 라벨
 private JLabel label1;
 // 대화명 입력 텍스트필드
 private JTextField idInput;
 
 // 로그아웃 패널
 private JPanel logoutPanel;
 // 대화명 출력 라벨
 private JLabel label2;
 // 로그아웃 버튼
 private JButton logoutButton;

 
 // 입력  패널 구성
 private JPanel msgPanel;
 // 메시지 입력 텍스트필드
 private JTextField msgInput;
 // 종료 버튼
 private JButton exitButton;

 // 메인 윈도우
 private JFrame jframe;
 // 채팅 내용 출력창
 private JTextArea msgOut;
 
 // 카드레이아웃 관련
 private Container tab;
 private CardLayout clayout;
 
 private Thread thread;
 
 // 상태 플래그
 boolean status;
 
 public MultiChatClient(String ip) {
  this.ip = ip;
    
  // 로그인 패널 화면 구성
  loginPanel = new JPanel();
  // 레이아웃 설정
  loginPanel.setLayout(new BorderLayout());
  idInput = new JTextField(15);
  loginButton = new JButton("로그인");
  // 이벤트 리스너 등록
  loginButton.addActionListener(this);
  label1 = new JLabel("대화명 ");
  // 패널에 위젯 구성
  loginPanel.add(label1,BorderLayout.WEST);
  loginPanel.add(idInput,BorderLayout.CENTER);
  loginPanel.add(loginButton,BorderLayout.EAST);
  
  // 로그아웃 패널 구성
  logoutPanel = new JPanel();
  // 레이아웃 설정
  logoutPanel.setLayout(new BorderLayout());
  label2 = new JLabel();
  logoutButton = new JButton("로그아웃");
  // 이벤트 리스너 등록
  logoutButton.addActionListener(this);
  
  // 패널에 위젯 구성
  logoutPanel.add(label2,BorderLayout.CENTER);
  logoutPanel.add(logoutButton,BorderLayout.EAST);

  // 입력 패널 구성
  msgPanel = new JPanel();
  // 레이아웃 설정
  msgPanel.setLayout(new BorderLayout());
  msgInput = new JTextField(30);
  // 이벤트 리스너 등록
  msgInput.addActionListener(this);
  exitButton = new JButton("종료");
  exitButton.addActionListener(this);
  // 패널에 위젯 구성
  msgPanel.add(msgInput,BorderLayout.CENTER);
  msgPanel.add(exitButton,BorderLayout.EAST);

  
  // 로그인/로그아웃 패널 선택을 위한 CardLayout 패널
  tab = new JPanel();
  clayout = new CardLayout();
  tab.setLayout(clayout);
  tab.add(loginPanel,"login");
  tab.add(logoutPanel,"logout");
  
  // 메인 프레임 구성
  jframe = new JFrame("::멀티챗::");
  msgOut = new JTextArea("",10,30);
  // JTextArea 의 내용을 수정하지 못하도록 함. 즉 출력전용으로 사용
  msgOut.setEditable(false);
  // 수직 스크롤바는 항상 나타내고 수평 스크롤바는 필요시 나타나도록 함.
  JScrollPane jsp = new JScrollPane(msgOut,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
  jframe.add(tab,BorderLayout.NORTH);
  jframe.add(jsp,BorderLayout.CENTER);
  jframe.add(msgPanel,BorderLayout.SOUTH);
  // loginPanel 을 우선 보이도록 함.
  clayout.show(tab, "login");
  // 프레임 크기 자동으로 설정
  jframe.pack();
  // 프레임 크기 조정 불가 설정
  jframe.setResizable(false);
  // 프레임이 보여지도록 함
  jframe.setVisible(true);
  
 }

 public void connectServer() {
  try {
   // 소켓 생성
   socket = new Socket(ip,8888);
   System.out.println("[Client]Server 연결 성공!!");
   
   // 입출력 스트림 생성
   inMsg = new BufferedReader(new InputStreamReader(socket.getInputStream()));
   outMsg = new PrintWriter(socket.getOutputStream(),true);
  
   // 서버에 로그인 메시지 전달
   outMsg.println(id+"/"+"login");
   
   // 메시지 수신을 위한 스레드 생성
   thread = new Thread(this);
   thread.start();
  }
  catch(Exception e) {
   //e.printStackTrace();
   System.out.println("[MultiChatClient]connectServer() Exception 발생!!");
  }
 }
 
 // 이벤트 처리
 public void actionPerformed(ActionEvent arg0) {
  Object obj = arg0.getSource();
  
  // 종료버튼 처리
  if(obj == exitButton) {
   System.exit(0);
  }
  else if(obj == loginButton) {
   id = idInput.getText();
   
   label2.setText(" 대화명 : "+id);
   clayout.show(tab, "logout");
   connectServer();
  }
  else if(obj == logoutButton) {
   // 로그아웃 메시지 전송
   outMsg.println(id+"/"+"logout");
   // 대화창 클리어
   msgOut.setText("");
   // 로그인 패널로 전환
   clayout.show(tab, "login");
   outMsg.close();
   try {
    inMsg.close();
    socket.close();
   } catch (IOException e) {
    e.printStackTrace();
   }

   status=false;
  }
  else if(obj == msgInput) {
   // 메시지 전송
   outMsg.println(id+"/"+msgInput.getText());
   // 입력창 클리어
   msgInput.setText("");
  }
 }
 
 public void run() {
  // 수신 메시지 처리를 위한 변수
  String msg;
  String[] rmsg;
  
  status=true;
  
  while(status) {
   try{
    // 메시지 수신 및 파싱
    msg = inMsg.readLine();
    rmsg = msg.split("/");
    
    // JTextArea 에 수신된 메시지 추가
    msgOut.append(rmsg[0]+">"+rmsg[1]+"\n");
    
    // 커서를 현재 대화 메시지에 보여줌
    msgOut.setCaretPosition(msgOut.getDocument().getLength());
   }
   catch(IOException e) {
    //e.printStackTrace();
    status = false;
   }
  }
  System.out.println("[MultiChatClient]"+thread.getName()+" 종료됨");
 }
 
 public static void main(String[] args) {
  MultiChatClient mcc = new MultiChatClient("localhost");
 }
}

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

shellSort  (0) 2012.04.04
오픈 API를 이용한 간단한 번역프로그램  (0) 2012.03.29
ChatClient  (0) 2012.03.29
MultiChatServer  (0) 2012.03.29
큐를 이용한 간단한 구직Pro  (0) 2012.03.29
queueADT를 이용한 간단한 응용프로그램  (0) 2012.03.29
circularAry 큐를 사용하여 복사하기  (0) 2012.03.29
StackADT를 이용한 중위식구하기  (0) 2012.03.29
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,