import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;
public class GUIChatServer extends Frame implements ActionListener{
Button bt_exit; //종료버튼
TextArea txt_list; // 접속한 목록 출력
Vector list; //접속한 사람 저장
public GUIChatServer(){
setTitle("GUI 채팅 서버 ver 1.0");
list = new Vector();
bt_exit = new Button("서버종료");
bt_exit.addActionListener(this); //종료버튼 이벤트 등록
txt_list = new TextArea();
add(txt_list, BorderLayout.CENTER);
add(bt_exit, BorderLayout.SOUTH);
setBounds(250,250,200,200);
setVisible(true);
ServerStart(); // 채팅 서버 시작
}//생성자
public void ServerStart() {
final int port = 5005; //채팅 포트 상수 지정
try {
ServerSocket ss = new ServerSocket(port);
while(true){
Socket client = ss.accept(); //클라이언트 올때마다 소켓 생성_접속을 기다린다
txt_list.append(client.getInetAddress().getHostAddress()+"\n");
ChatHandle ch= new ChatHandle(client); //클라이언트 한명씩 처리
list.addElement(ch); //클라인트가 들어올때마다 list에 담는다
ch.start(); //시작
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new GUIChatServer();
}
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
public void setMsg(String msg){
txt_list.append(msg+"\n"); //화면 msg출력
}
public void Send_All(String msg){ //모든 사용자에게 msg내용을 전송
try {
synchronized(list) {
int size = list.size(); //채팅 사용자의 수를 얻는다
for (int i = 0; i < size ; i++) {
ChatHandle cha = (ChatHandle) list.elementAt(i);
synchronized (cha.pw) {
//ChatHandle의 pw객체를 이용한 문자 전송
cha.pw.println(msg);
cha.pw.flush();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}//end Send_All
public class ChatHandle extends Thread{
BufferedReader br = null; //읽어오기
PrintWriter pw = null; //보내기
Socket clinet = null;
public ChatHandle(Socket client){
this.clinet = client;
try {
InputStream is = client.getInputStream(); //입력
br = new BufferedReader(new InputStreamReader(is));
OutputStream os = client.getOutputStream(); //출력
pw = new PrintWriter(new OutputStreamWriter(os));
} catch (IOException e) {
e.printStackTrace();
}
}//생성자
public void Send_All(String msg){ //모든 사용자에게 msg내용을 전송
try {
synchronized(list) {
int size = list.size(); //채팅 사용자의 수를 얻는다
for (int i = 0; i < size ; i++) {
ChatHandle cha = (ChatHandle) list.elementAt(i);
synchronized (cha.pw) {
//ChatHandle의 pw객체를 이용한 문자 전송
cha.pw.println(msg);
cha.pw.flush();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}//end Send_All
@Override
public void run() {
String name = "";
try {
name = br.readLine();
Send_All(name+"님께서 입장");
while(true){
String msg = br.readLine(); //채팅내용받기
String str = clinet.getInetAddress().getHostName();
setMsg(str + ":"+msg);//채팅내용보기
if(msg.equals("@@Exit")){//사용자가 @@Exit를 입력하면
break; //반복문 종료
}else{
Send_All(name+">>"+msg); //모두에게 채팅내용 전송
}//else
}//end while
} catch (Exception e) {
e.printStackTrace();
}finally{
list.remove(this); //사용자 한명 지우기
try {
br.close();
pw.close();
clinet.close();
} catch (IOException e) {
e.printStackTrace();
}
}// end run
}
}
}
'컴퓨터 > 언어,프로그래밍' 카테고리의 다른 글
[스크랩] HTML과 form 관련 태그 - input (0) | 2010.02.20 |
---|---|
채팅프로그램 Client (0) | 2009.10.08 |
자바 플래시 XML 채팅 서버 (0) | 2009.10.08 |
버튼 클릭과 동시에 textarea내용이 클립보드로 저장되는 소스 + 위지윅 프로그램 소스 (0) | 2009.09.30 |
[스크랩] PHP에서 자바스크립트 변수넘기기 2가지방법 정리 (0) | 2009.09.28 |