묻고답하기

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 남기남
Nooloongji 이 소스를 수정하고 싶은데요.. 될까요?  
오진호 input tpe=submit , input type=button 투명하게 할려면 [1] 2007.08.10
유진 프레임으로 나누고 점선을 넣고 싶거든요  
나나야 팝업창이 쿠키를지워야 띄워집니다.ㅠ  
우라질넘 iframe 자동높이조절 스크립트 중에서... [1] 2007.08.10
이태 포토샵에서 화면 정확하게 6분할 하고 싶은데요. [1] 2007.08.10
고정수 외부로그인에 대한 질문입니다. 고수님들 답변부탁드려요. [2] 2007.08.10
장하늘 슬라이스 툴에 관해서.. [1] 2007.08.10
박진규 펼쳐지는 메뉴(?)가 궁굼합니다. [1] 2007.08.10
黑虎 페이지 이동 태그막기 [3] 2007.08.10
최기준 php 소스코드 실행~~ 먹통입니다~~ 도와주삼 ㅠ.ㅠ [2] 2007.08.10
핑크푸딩 스킨을 다 만들고요 [1] 2007.08.10
김종욱 트랙백 기능에 관해서  
neptune 웹브라우저 종류에 따라 다른페이지 보여주기 (익스플로러, 파이어폭스)  
Polaris[Kon 소스 분석점 ...해주세요 ㅠ  
정일영 처음 홈페이지 웹디자인 할 때의 요령 질문  
김광일 플래시와 제로보드 연동 어떻게 해요? [1] 2007.08.10
남창극 폼메일관련 문의합니다. [2] 2007.08.10
김성준 JSP 호스팅 싸고 추천할 만한... 속도도 안정적인 곳... 추천좀..  
서창균 winamp방송소스 빼올때  
김태연 노프레임에서 나모로 만든 메뉴와 제로보드 게시판 삽입시 페이지 오류가 납니다..  
이증규 표만들때 [1] 2007.08.10
신호철 제로보드 최근게시물 관련 질문입니다  
하직녀 인쇄버튼이나 출력에 대한 질문 [1] 2007.08.10
신호철 새창으로 안뜨게 하는방법~ [1] 2007.08.10
Dunny 테이블 &서브메뉴 관련 질문이에요 ㅡ [2] 2007.08.10
NamSoohyun 다운로드 자료실에있는 레이아웃 자료에 대한 질문입니다. [2] 2007.08.10
매직캣 php 정말 도와주세요~  
완전홈피초보 포토샵을 배우고싶으나 어떻게 시작해야할지모르겠습니다. [2] 2007.08.10
이증규 php언어에 html삽입하는 방법 [1] 2007.08.10