묻고답하기

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] 2013.08.16 by sejin7940
NO1.XE 안녕하세요. 스크랩관련 문의 드립니다. [1] 2013.08.16 by sejin7940
nike077 주소뒤 index.php?mid 좀 없애는 방법... [1] 2013.08.16 by sejin7940
태그맨 게시판 권한 설정이 좀 불편해보입니다. [2] file 2013.08.16 by sejin7940
때린데 또때려 XE core 1.7.3.4 용 게시판이 따로 있나요? [2] 2013.08.16 by 때린데 또때려
존덕 홈페이지 보안 [1] 2013.08.16 by 킴똥똥
마쵸 게시판 일반 회원 HTML 편집기 오류에 대해 문의드립니다. [1] 2013.08.16 by 킴똥똥
지나김 다국어 언어선택 관련 질문입니다. [1] file 2013.08.16 by 킴똥똥
takeout 다시작성해야겠네요. [1] 2013.08.16 by 비로코
비로코 추천 비추천 버튼 관련 질문 [3] 2013.08.15 by ISGAON_
gggggggggg 계정 이전 [1] 2013.08.15 by pentopen
걷고있는그녀 사이트 광고 좀 질문드릴게요  
키보 목록버튼을 게시판본문바로 아래넣고 싶습니다. 어떻게하나요? [1] file 2013.08.15 by ISGAON_
키보 추천 비추천 버튼을 내맘대로 바꾸는 법을알려주세요 [1] file 2013.08.15 by ISGAON_
구름나무바위 에디터로 FTP 접속후 레이아웃 직접 편집 불가능한 이유좀 알려주세요. [2] 2013.08.15 by 쿨럭이
서버링 상단 어드민바 안보이게... [2] 2013.08.15 by 킴똥똥
띠로리리린 게시판 글쓰기가 사라져요. (추가내용) [1] 2013.08.15 by 쿨럭이
키보 게시판 비밀글 기능 질문드립니다. [1] file 2013.08.15 by 쿨럭이
HK홍 게시판에서 파일 업로드할때 질문드립니다.  
살라리꽃 nginx 제로보드(XE) 설정방법 부탁드리겠습니다.