MultiChatClient
package com.chat.v5;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class MultiChatClient implements ActionListener, Runnable{
private String ip;
private String id;
private Socket socket;
// 입출력 스트림
private BufferedReader inMsg = null;
private PrintWriter outMsg = null;
// 로그인 패널
private JPanel loginPanel;
// 로그인 버튼
private JButton loginButton;
// 대화명 라벨
private JLabel label1;
// 대화명 입력 텍스트필드
private JTextField idInput;
// 로그아웃 패널
private JPanel logoutPanel;
// 대화명 출력 라벨
private JLabel label2;
// 로그아웃 버튼
private JButton logoutButton;
// 입력 패널 구성
private JPanel msgPanel;
// 메시지 입력 텍스트필드
private JTextField msgInput;
// 종료 버튼
private JButton exitButton;
// 메인 윈도우
private JFrame jframe;
// 채팅 내용 출력창
private JTextArea msgOut;
// 카드레이아웃 관련
private Container tab;
private CardLayout clayout;
private Thread thread;
// 상태 플래그
boolean status;
public MultiChatClient(String ip) {
this.ip = ip;
// 로그인 패널 화면 구성
loginPanel = new JPanel();
// 레이아웃 설정
loginPanel.setLayout(new BorderLayout());
idInput = new JTextField(15);
loginButton = new JButton("로그인");
// 이벤트 리스너 등록
loginButton.addActionListener(this);
label1 = new JLabel("대화명 ");
// 패널에 위젯 구성
loginPanel.add(label1,BorderLayout.WEST);
loginPanel.add(idInput,BorderLayout.CENTER);
loginPanel.add(loginButton,BorderLayout.EAST);
// 로그아웃 패널 구성
logoutPanel = new JPanel();
// 레이아웃 설정
logoutPanel.setLayout(new BorderLayout());
label2 = new JLabel();
logoutButton = new JButton("로그아웃");
// 이벤트 리스너 등록
logoutButton.addActionListener(this);
// 패널에 위젯 구성
logoutPanel.add(label2,BorderLayout.CENTER);
logoutPanel.add(logoutButton,BorderLayout.EAST);
// 입력 패널 구성
msgPanel = new JPanel();
// 레이아웃 설정
msgPanel.setLayout(new BorderLayout());
msgInput = new JTextField(30);
// 이벤트 리스너 등록
msgInput.addActionListener(this);
exitButton = new JButton("종료");
exitButton.addActionListener(this);
// 패널에 위젯 구성
msgPanel.add(msgInput,BorderLayout.CENTER);
msgPanel.add(exitButton,BorderLayout.EAST);
// 로그인/로그아웃 패널 선택을 위한 CardLayout 패널
tab = new JPanel();
clayout = new CardLayout();
tab.setLayout(clayout);
tab.add(loginPanel,"login");
tab.add(logoutPanel,"logout");
// 메인 프레임 구성
jframe = new JFrame("::멀티챗::");
msgOut = new JTextArea("",10,30);
// JTextArea 의 내용을 수정하지 못하도록 함. 즉 출력전용으로 사용
msgOut.setEditable(false);
// 수직 스크롤바는 항상 나타내고 수평 스크롤바는 필요시 나타나도록 함.
JScrollPane jsp = new JScrollPane(msgOut,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
jframe.add(tab,BorderLayout.NORTH);
jframe.add(jsp,BorderLayout.CENTER);
jframe.add(msgPanel,BorderLayout.SOUTH);
// loginPanel 을 우선 보이도록 함.
clayout.show(tab, "login");
// 프레임 크기 자동으로 설정
jframe.pack();
// 프레임 크기 조정 불가 설정
jframe.setResizable(false);
// 프레임이 보여지도록 함
jframe.setVisible(true);
}
public void connectServer() {
try {
// 소켓 생성
socket = new Socket(ip,8888);
System.out.println("[Client]Server 연결 성공!!");
// 입출력 스트림 생성
inMsg = new BufferedReader(new InputStreamReader(socket.getInputStream()));
outMsg = new PrintWriter(socket.getOutputStream(),true);
// 서버에 로그인 메시지 전달
outMsg.println(id+"/"+"login");
// 메시지 수신을 위한 스레드 생성
thread = new Thread(this);
thread.start();
}
catch(Exception e) {
//e.printStackTrace();
System.out.println("[MultiChatClient]connectServer() Exception 발생!!");
}
}
// 이벤트 처리
public void actionPerformed(ActionEvent arg0) {
Object obj = arg0.getSource();
// 종료버튼 처리
if(obj == exitButton) {
System.exit(0);
}
else if(obj == loginButton) {
id = idInput.getText();
label2.setText(" 대화명 : "+id);
clayout.show(tab, "logout");
connectServer();
}
else if(obj == logoutButton) {
// 로그아웃 메시지 전송
outMsg.println(id+"/"+"logout");
// 대화창 클리어
msgOut.setText("");
// 로그인 패널로 전환
clayout.show(tab, "login");
outMsg.close();
try {
inMsg.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
status=false;
}
else if(obj == msgInput) {
// 메시지 전송
outMsg.println(id+"/"+msgInput.getText());
// 입력창 클리어
msgInput.setText("");
}
}
public void run() {
// 수신 메시지 처리를 위한 변수
String msg;
String[] rmsg;
status=true;
while(status) {
try{
// 메시지 수신 및 파싱
msg = inMsg.readLine();
rmsg = msg.split("/");
// JTextArea 에 수신된 메시지 추가
msgOut.append(rmsg[0]+">"+rmsg[1]+"\n");
// 커서를 현재 대화 메시지에 보여줌
msgOut.setCaretPosition(msgOut.getDocument().getLength());
}
catch(IOException e) {
//e.printStackTrace();
status = false;
}
}
System.out.println("[MultiChatClient]"+thread.getName()+" 종료됨");
}
public static void main(String[] args) {
MultiChatClient mcc = new MultiChatClient("localhost");
}
}
'1. IT Story > Development' 카테고리의 다른 글
shellSort (0) | 2012.04.04 |
---|---|
오픈 API를 이용한 간단한 번역프로그램 (0) | 2012.03.29 |
ChatClient (0) | 2012.03.29 |
MultiChatServer (0) | 2012.03.29 |
큐를 이용한 간단한 구직Pro (0) | 2012.03.29 |
queueADT를 이용한 간단한 응용프로그램 (0) | 2012.03.29 |
circularAry 큐를 사용하여 복사하기 (0) | 2012.03.29 |
StackADT를 이용한 중위식구하기 (0) | 2012.03.29 |