묻고답하기
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
소스 분석점 ...해주세요 ㅠ
2006.10.06 12:27
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;
}
}
쫌 자세히점..설명점 해주실수있나요
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;
}
}
쫌 자세히점..설명점 해주실수있나요