묻고답하기

import java.net.*;
import java.io.*;

/* ChatServer에서 매개 변수로 (ChatServer server, Socket s) 받고
* 실질적인 채팅 메세지 전송과 검사가 이루어 지는 곳이다 .
* */
public class ChatHandler extends Thread {
//        private   boolean          debug = false;
        protected Socket           s;
        protected BufferedReader   i;
        protected PrintWriter      o;
        protected ChatServer       server;
        protected boolean          stop;
        //protected String name = "";
        
        /*ChatHandler의 생성자로써 ChatServer에서 매개 변수로 (ChatServer server, Socket s) 받아
         * ChatHandler가 작업을 수행할수 있게 초기화를 해준다
         * */
        
        public ChatHandler(ChatServer server, Socket s)
                throws IOException {
                
                this.s = s;
                this.server = server;
                InputStream ins = s.getInputStream();
                OutputStream os = s.getOutputStream();
                i = new BufferedReader(new InputStreamReader(ins));
                o = new PrintWriter(new OutputStreamWriter(os));
        
        }
        
        /* "/exit" 명령어가 입력되면 스레디가 저장된 벡타 타입의 handllers에서 해당 스레드를 삭제 한다 */
        public void setStop() {
                stop = true;
                synchronized(server.handlers) {
                        server.handlers.remove(this);
                }
        }
        
        /*서버와 클라이언트가 연결된후 클라이언트에서  입력이 들어오면 그  스트림을 확인한 후
         * 작업 명령어 이면 해당하는 작업을 수행한고 그냥 스트링이면 그대루 broadcast()를 호출
         * 그대루 각 클라이언트 화면에 출력해준다    
         * */
        public void run () {
                
        
                String msg="";
                String name="";
                try {
                        name = i.readLine();
                        broadcast (name + "님이 방문하셨습니다.");
                        while (!stop) {
                                msg = i.readLine();
                                msg= filtering(msg);
                                if(msg.trim().equals("/exit")) {
                                        setStop();        
                                }
                                
                                else if(msg.trim().equals("/h")){
                                        broadcast("/h -도움말 , /c [chid] -아디이 변경 , /exit -채팅 종료 , /bw l -금지어 리스트 보기 n ");
                                }
                                else if(msg.trim().regionMatches(0,"/c ",0,3)){
                                name=chid(name,msg);
                                }
                                
                                else if(msg.trim().equals("/bw l"))
                                        for(int i=0;i<server.veclist.size();i++)broadcast((String)server.veclist.elementAt(i));
                        
                                
                                else {
                                broadcast (name + " - " + msg+"[ 접속자수:"+server.handlers.size()+" ]");    //사용자 이름과 메시지를 출력하기 위해 brodcast()매소드 호출
                                }
                        }
                } catch (IOException ex) {  
                //        if(debug)
                //                ex.printStackTrace();
                } finally {
                        server.handlers.removeElement(this);
                        System.out.println(s.getInetAddress()+"나갔습니다 ");
                        broadcast (server.handlers.size()+name + "님이 나가셨습니다.");
                        
                        try {
                                i.close();
                                o.close();
                                s.close();
                
                        } catch (IOException ex) {  
                
                        }
                }
        }
        

        /*입력 스토림의 문자를  금지어가 저장된 veclist에 요소들과 비교해 금지어 가있을시 xxx로 바꾸어 준다 */
        public String filtering(String msg) {
                int start;
                int point;
                String temp="";
                String replaceword="xxx";        
                String banword="";
                for(int i=0;i<server.veclist.size();i++)
                {
                         start=0;
                         point=0;
                         temp="";
                
                         banword=(String)server.veclist.elementAt(i);
                        //for(int j=0;j<banword.length();j++)        replaceword +='x';
                        while((point=msg.indexOf(banword,start))>=0){
                                point=msg.indexOf(banword,start);
                                temp = temp +msg.substring(start,point);
                                temp = temp+replaceword;
                                start=point+banword.length();                                                                                        //시작 포인트를 바꿔 준다
                        }
                        if(msg.indexOf(banword,start)==-1)temp=temp+msg.substring(start,msg.length());//남은 문자열 을 붙인다
                        msg=temp;
                }
                return msg;
        }

        /*필터링이 끝난 입력 스트림을 현재 서버에 접속해 있는 클라이언트 화면에 출력을 한다 */
        protected void broadcast (String message) {
                synchronized (server.handlers) {
                        int n = server.handlers.size();
                        for(int i=0; i < n; i++) {
                                ChatHandler c = (ChatHandler)server.handlers.elementAt(i);
                                try {
                                        synchronized (c.o) {
                                                c.o.println(message);
                                        }
                                        c.o.flush ();
                                } catch (Exception ex) {
                                        c.setStop();
                                }
                        }
                }
        }
        
        /*아이디 변경 작업을 수행한다  */
        public String chid(String name, String msg){
                
                String newname=msg.trim().substring(2).trim();
                broadcast(name +" 님의 대화명이 "+ newname+"으로 변경되었습니다n");
                return newname;
                
        }
}




쫌 자세히점..설명점 해주실수있나요
글쓴이 제목 최종 글
XE 공지 글 쓰기,삭제 운영방식 변경 공지 [16] 2019.03.05 by 남기남
조민재 로젠택배 배송조회 링크를 걸라고 하는데요. [1] 2007.08.10
이용훈 최근갤러리 질문입니다. 급합니다. 답변 부탁드립니다.  
김진숙 php질문좀 ㅠㅠ  
김세진 로그인시 그전 로그인과 일정시간 딜레이 시간 주는 asp소스에 대한 문의드립니다.  
신미선 동영상 강의를 하고 있는데.. "파일 저장"을 막는 방법은?  
도승일 서브목록의 게시판 크기 조절이 안됨  
핑크푸딩 이게 왜뜨죠??고치는방법이 ㅠㅠ [1] 2007.08.10
핑크푸딩 회원 마스터가 아닌 회원자신이 홈페이지 안에서 닉이미지 달수 잇는방법이..? [1] 2007.08.10
이증규 php언어에 html삽입하는 방법 [1] 2007.08.10
완전홈피초보 포토샵을 배우고싶으나 어떻게 시작해야할지모르겠습니다. [2] 2007.08.10
매직캣 php 정말 도와주세요~  
NamSoohyun 다운로드 자료실에있는 레이아웃 자료에 대한 질문입니다. [2] 2007.08.10
Dunny 테이블 &서브메뉴 관련 질문이에요 ㅡ [2] 2007.08.10
신호철 새창으로 안뜨게 하는방법~ [1] 2007.08.10
하직녀 인쇄버튼이나 출력에 대한 질문 [1] 2007.08.10
신호철 제로보드 최근게시물 관련 질문입니다  
이증규 표만들때 [1] 2007.08.10
김태연 노프레임에서 나모로 만든 메뉴와 제로보드 게시판 삽입시 페이지 오류가 납니다..  
서창균 winamp방송소스 빼올때  
김성준 JSP 호스팅 싸고 추천할 만한... 속도도 안정적인 곳... 추천좀..  
남창극 폼메일관련 문의합니다. [2] 2007.08.10
김광일 플래시와 제로보드 연동 어떻게 해요? [1] 2007.08.10
정일영 처음 홈페이지 웹디자인 할 때의 요령 질문  
Polaris[Kon 소스 분석점 ...해주세요 ㅠ  
neptune 웹브라우저 종류에 따라 다른페이지 보여주기 (익스플로러, 파이어폭스)  
김종욱 트랙백 기능에 관해서  
핑크푸딩 스킨을 다 만들고요 [1] 2007.08.10
최기준 php 소스코드 실행~~ 먹통입니다~~ 도와주삼 ㅠ.ㅠ [2] 2007.08.10
黑虎 페이지 이동 태그막기 [3] 2007.08.10
박진규 펼쳐지는 메뉴(?)가 궁굼합니다. [1] 2007.08.10