본문 바로가기

JAVA

채팅 프로그램 ( 욕설필터 기능 구현)

필터링 메서드 

파일 입출력으로 (fileInputStream으로) text파일을 읽어서 대조하는 방식

 

	public String filtering(String msg) {
		FileInputStream fis;
		InputStreamReader isr;
		BufferedReader bReader;
		try {
			
			fis = new FileInputStream("C:\\text\\filtering DB.txt"); //FileInputStream 객체생성
			isr = new InputStreamReader(fis,"UTF-8"); //InputStream객체 생성
			bReader = new BufferedReader(isr); //Buffered Reader 객체생성
			String words = bReader.readLine(); 
            // 파일에서 한줄씩 읽어와서  words에 저장
			String[] warr = words.split(","); 
            //,를 구분자로 words에 저장되 있는 단어들을 구분해서 각 요소에 저장
			int size= warr.length; //생성된 배열의 길이를 저장
			String filterword = ""; 
			for(int i=0; i<size ; i++) {
				filterword = warr[i]; //한 요소씩 읽어서 filterword에 저장
				if(msg.contains(filterword)) {
                // 매개변수로 받은 채팅내용에 해당 단어가 포함되어 있는지 확인
					int s = filterword.length(); 
                    //해당 단어(요소에서 읽어 온 단어)의 길이 저장
					String hider = ""; 
					int j=0;
					while(j<s) { 
                    //해당 단어의 길이만큼 *를 데이터로 갖고있는 String 변수 hinder 만들기
						hider = hider +"*";
						j++;
					}
					msg = msg.replaceAll(filterword, hider); 
                    //대화 내용중 filterword 부분을 hinder로 대체하여 다시 저장
						
				} //if
			}//for
            
            	} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("지정 경로에 해당파일 없음");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return msg; // 욕설에 해당하는 부분을 *로 대체한 대화내용을 전달
	}

메세지 출력 부분 변동 

Socket soket;
		String msg;
		String[] rmsg;
		String filteredmsg;
		
		
		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(socket.getInputStream())); 
                //예외발생 가능성
				outMsg = new PrintWriter(socket.getOutputStream(), true);
			

				while(status) { //수신부
					
					msg = inMsg.readLine(); 
					filteredmsg = filtering(msg); 
                    //클라이언트에게 받은 채팅내용을 filtering메서드를 이용해서 대화내용 변환
					rmsg = msg.split("/");
					
					
	case NOMAL: {
							
					broadCast(filteredmsg); //필터링된 대화내용 전체출력
					break;
						}
	case WISPER: {			
					ChatThread from = hash.get(rmsg[1]); 
					ChatThread to =  hash.get(rmsg[2]); 
					wisper(from,to, filteredmsg); 
                    //찾은 송신 스레드 , 수신 스레드, 필터링 내용을 매개변수로 wisper메소드 호출
					break;
						}

적용화면 채팅입력칸에 친 단어가 ****가려진 단어

실행화면을 보면 알겠지만 한국어 욕은 인식을 못하고 영어욕만 인식한다.

text파일에 한국어로 된 욕이 훨씬 더 많음에도 불구하고...

 

디버깅 돌려보니 text파일에서 한국어 욕을 읽어올 때 깨진채로 가져와서 제대로 된 대조가 안됨.

인코딩에 문제가 있는 것 같은데 아무리해도 인식불가...

inputstreamreader 연결할 때 매개변수로 UTF-8, EUC-KR 별 걸 다 넣어봤는데 안됨.

하도 인코딩 설정을 만지는 바람에 이클립스 자체 인코딩도 이상하게 되서 프로그램 지웠다가 다시 설치할 뻔.

 

그래도 어쨌든 의도한 대로 작동은 해서 일단 업데이트 겸 올린다.

읽어와서 대조하는 작업은 되니까.

 

이제 파일전송 남았는데..... 

 

++추가 

뭐가 문제 인지 알았다.

text파일 , 사이에 있는 공백이 문제였던 것.

나쁜놈을 읽어오는게 아니라 " 나쁜놈"을 읽어와서 대조를 하니 인식을 못함.

중간에 trim을 넣어줬더니 잘 됨.