본문 바로가기

컴퓨터/언어,프로그래밍

채팅프로그램 Server

채팅프로그램 Server

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;


public class GUIChatServer extends Frame implements ActionListener{

 Button bt_exit; //종료버튼
 TextArea txt_list; // 접속한 목록 출력
 Vector list; //접속한 사람 저장
 
 public GUIChatServer(){
  setTitle("GUI 채팅 서버 ver 1.0");
  list = new Vector();
  bt_exit = new Button("서버종료");
  bt_exit.addActionListener(this); //종료버튼 이벤트 등록
  txt_list = new TextArea();
  add(txt_list, BorderLayout.CENTER);
  add(bt_exit, BorderLayout.SOUTH);
  setBounds(250,250,200,200);
  setVisible(true);
  ServerStart(); // 채팅 서버 시작
 }//생성자
 
 public void ServerStart() {
  final int port = 5005; //채팅 포트 상수 지정
  try {
   ServerSocket ss = new ServerSocket(port);
   while(true){
    Socket client = ss.accept(); //클라이언트 올때마다 소켓 생성_접속을 기다린다
    txt_list.append(client.getInetAddress().getHostAddress()+"\n");
    ChatHandle ch= new ChatHandle(client); //클라이언트 한명씩 처리
    list.addElement(ch); //클라인트가 들어올때마다 list에 담는다
    ch.start(); //시작
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
  
 }

 public static void main(String[] args) {
  new GUIChatServer();

 }

 @Override
 public void actionPerformed(ActionEvent e) {
  System.exit(0);
  
 }
 public void setMsg(String msg){
  txt_list.append(msg+"\n"); //화면 msg출력
 }
 public void Send_All(String msg){ //모든 사용자에게 msg내용을 전송
  try {
   synchronized(list) {
    int size = list.size(); //채팅 사용자의 수를 얻는다
    for (int i = 0; i < size ; i++) {
     ChatHandle cha = (ChatHandle) list.elementAt(i);
     synchronized (cha.pw) {
      //ChatHandle의 pw객체를 이용한 문자 전송
      cha.pw.println(msg);
      cha.pw.flush();
     }
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }//end Send_All
 
 public class ChatHandle extends Thread{
  BufferedReader br = null; //읽어오기
  PrintWriter pw = null; //보내기
  Socket clinet = null;
  public ChatHandle(Socket client){
   this.clinet = client;
   try {
    InputStream is = client.getInputStream(); //입력
    br = new BufferedReader(new InputStreamReader(is));
    OutputStream os = client.getOutputStream(); //출력
    pw = new PrintWriter(new OutputStreamWriter(os));
   } catch (IOException e) {
    e.printStackTrace();
   } 
  }//생성자
  
  public void Send_All(String msg){ //모든 사용자에게 msg내용을 전송
   try {
    synchronized(list) {
     int size = list.size(); //채팅 사용자의 수를 얻는다
     for (int i = 0; i < size ; i++) {
      ChatHandle cha = (ChatHandle) list.elementAt(i);
      synchronized (cha.pw) {
       //ChatHandle의 pw객체를 이용한 문자 전송
       cha.pw.println(msg);
       cha.pw.flush();
      }
     }
    }
   } catch (Exception e) {
    e.printStackTrace();
   }
  }//end Send_All
  @Override
  public void run() {
   String name = "";
   try {
    name = br.readLine();
    Send_All(name+"님께서 입장");
    while(true){
     String msg = br.readLine(); //채팅내용받기
     String str = clinet.getInetAddress().getHostName();
     setMsg(str + ":"+msg);//채팅내용보기
     if(msg.equals("@@Exit")){//사용자가 @@Exit를 입력하면
      break; //반복문 종료
     }else{
      Send_All(name+">>"+msg); //모두에게 채팅내용 전송
     }//else
      
    }//end while
   } catch (Exception e) {
    e.printStackTrace();
   }finally{
    list.remove(this); //사용자 한명 지우기
    try {
     br.close();
     pw.close();
     clinet.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
  }// end run
  
 }
}
}


제주삼다수, 2L,... 오뚜기 진라면 매운... 상하목장 유기농 흰... 남양 프렌치카페 카... 고려인삼유통 홍삼 ... 종근당건강 오메가3... 요이치 카링 유무선...