채팅 프로그램 이어서
package com.tech.gt010.chat;
import java.net.*;
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
public class ChatServer extends Frame implements ActionListener {
Button btnExit;
TextArea ta;
Vector vChatList;
ServerSocket ss;
Socket sockClient;
public ChatServer() {
setTitle("GUI 채팅 서버 ver 1.0");
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose(); // 자원 반납후 프레임 닫기
}// windowClosing
});// X 클릭시 종료
vChatList = new Vector();
btnExit = new Button("서버 종료");
btnExit.addActionListener(this);
ta = new TextArea();
add(ta, BorderLayout.CENTER);
add(btnExit, BorderLayout.SOUTH);
setBounds(250, 250, 300, 200);
setVisible(true);// 보이기
chatStart(); // 채팅 메소드 시작
}// 생성자
public void chatStart() { // 채팅 시작
try {
ss = new ServerSocket(5005);// 포트번호
while (true) { // 무한 반복
sockClient = ss.accept(); // 클라이언트 올 때마다 소켓 생성
ta.append(sockClient.getInetAddress().getHostAddress() + "접속함\n");
ChatHandle threadChat = new ChatHandle();// 한명씩 처리
vChatList.add(threadChat);// 리스트에 담는다.
threadChat.start(); // ChatHandle 쓰레드 시작
} // while
} catch (Exception e) {
e.printStackTrace();
} // catch
}// ServerStart
public void actionPerformed(ActionEvent e) {
// 서버 종료 버튼 클릭시
dispose(); // 윈도우 자원 반납후 닫기
}// actionPerformed
public static void main(String[] args) {
new ChatServer();
}// main
// 클라이언트 채팅을 처리하는 Thread 를 상속받은 내부 클래스
class ChatHandle extends Thread {
BufferedReader br = null; // 입력 담당
PrintWriter pw = null; // 출력 담당
public ChatHandle() {
try {
InputStream is = sockClient.getInputStream();// 입력
br = new BufferedReader(new InputStreamReader(is));
OutputStream os = sockClient.getOutputStream();// 출력
pw = new PrintWriter(new OutputStreamWriter(os));
} catch (IOException e) {
e.printStackTrace();
} // catch
}// 내부 클래스의 기본 생성자
public void sendAllClient(String msg) {// 모두에게 채팅 내용 전송
try {
int size = vChatList.size();// 채팅 사용자의 수를 얻는다.
for (int i = 0; i < size; i++) {
// 반복문을 돌면서 한 사람씩 채팅 내용을 보낸다.
ChatHandle chr = (ChatHandle) vChatList.elementAt(i);
chr.pw.println(msg); // 사용자 한 사람의 채팅 내용 전송
chr.pw.flush(); // 버퍼의 내용을 즉시 전송하라.
} // for
} catch (Exception e) {
e.printStackTrace();
} // catch
}// send_All
public void run() {
try {
String name = br.readLine(); // 사용자 닉네임 얻기
sendAllClient(name + " 님께서 새로 입장했습니다");
while (true) { // 무한 반복
String msg = br.readLine();// 채팅 내용 받기
String str = sockClient.getInetAddress().getHostName();
ta.append(msg + "\n"); // 채팅 내용 ta 에 보기
if (msg.equals("@@Exit")) {// 사용자가 @@Exit를 입력하면
break; // 반복문 종료(채팅 끝)
} else {
sendAllClient(name + " : " + msg);// 모두에게 채팅내용 전송
} // else
} // while
} catch (Exception e) {
e.printStackTrace();
} finally {
vChatList.remove(this);// 사용자 한 명 지우기
try {
br.close();
pw.close();
sockClient.close();
} catch (Exception e) {
} // catch
} // finally
}// run
}// 내부 클래스 ChatHandle 의 끝
}// end
ChatServer.java
package com.tech.gt010.chat;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
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.Socket;
public class ChatClient extends Frame implements ActionListener,Runnable{
Button btn_exit; // 종료
Button btn_send; // 전송
Button btn_connect; // 서버 접속
TextArea txt_list; // 채팅 내용
TextField txt_server_ip; // ip
TextField txt_name; // 대화명
TextField txt_input; // 채팅내용
Socket client;
BufferedReader br; // 입력 객체
PrintWriter pw; // 출력 객체
String server_ip; // 서버 ip 텍스트
final int port=5005; // 포트번호
CardLayout cl; // 카드 레이아웃
public ChatClient() {
// 화면구성
setTitle("채팅 클라이언트 ver1.1");
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
dispose(); // 자원 반납 후 프레임 닫기
}
});
cl=new CardLayout();
setLayout(cl);
// 접속화면구성
Panel connect=new Panel(); // 접속화면판넬
connect.setBackground(Color.LIGHT_GRAY);
connect.setLayout(new BorderLayout());
btn_connect=new Button("서버접속");
btn_connect.addActionListener(this);
txt_server_ip=new TextField("172.16.4.16",15);
txt_name=new TextField("홍길동",15);
Panel connect_sub=new Panel(); // 접속창의 서브판넬
connect_sub.add(new Label("서버아이피(IP) : "));
connect_sub.add(txt_server_ip);
connect_sub.add(new Label("대화명 : "));
connect_sub.add(txt_name);
// 채팅판넬구성
Panel chat=new Panel();
chat.setLayout(new BorderLayout());
Label lblChat=new Label("채팅접속화면",Label.CENTER);
connect.add(lblChat,BorderLayout.NORTH);
connect.add(connect_sub,BorderLayout.CENTER);
connect.add(btn_connect,BorderLayout.SOUTH);
// 채팅창화면구성
txt_list=new TextArea(); // 채팅내용을 보여줌
txt_input=new TextField("",20); // 채팅입력
btn_exit=new Button("종료");
btn_send=new Button("전송");
btn_exit.addActionListener(this);
btn_send.addActionListener(this);
txt_input.addActionListener(this);
// 채팅창하위판넬구성
Panel chat_sub=new Panel();
chat_sub.add(txt_input);
chat_sub.add(btn_send);
chat_sub.add(btn_exit);
Label lblChatTitle=new Label("채팅프로그램ver 1.1",Label.CENTER);
chat.add(lblChatTitle,BorderLayout.NORTH);
chat.add(txt_list,BorderLayout.CENTER);
chat.add(chat_sub,BorderLayout.SOUTH);
add(connect,"접속창");
add(chat,"채팅창");
cl.show(this, "접속창");
setBounds(250,250,300,300);
setVisible(true);
}
@Override
public void run() {
try {
client=new Socket(server_ip,port);
InputStream is=client.getInputStream(); // 입력
OutputStream os=client.getOutputStream(); // 출력
br=new BufferedReader(new InputStreamReader(is));
pw=new PrintWriter(new OutputStreamWriter(os));
String msg=txt_name.getText(); // 대화명 얻기
pw.println(msg); // 대화명 전송
pw.flush(); // 즉시 전송
txt_input.requestFocus(); // 채팅 입력창에 커서 위치시키기
while (true) {
msg=br.readLine(); // 채팅 내용 받기
txt_list.append(msg+"\n"); // 채팅 내용 보여주기
}// while
} catch (Exception e) {
// TODO: handle exception
} // end catch
} // run
@Override
public void actionPerformed(ActionEvent e) {
try {
Object obj=e.getSource();
if(obj==btn_connect) {
server_ip=txt_server_ip.getText();
Thread th=new Thread(this);
th.start();
cl.show(this, "채팅창");
}else if(obj==btn_exit) {
System.exit(0); // 프로그램 종료
}else if(obj==btn_send || obj==txt_input) {
// 채팅진행
String msg=txt_input.getText();
pw.println(msg); // 채팅 내용 전송
pw.flush(); // 즉시 전송
txt_input.setText(""); // 내용 비우기
txt_input.requestFocus();
}
} catch (Exception e2) {
}
}
public static void main(String[] args) {
new ChatClient();
}
}
ChatClient.java
실행 모습
자바는 자료구조를 바탕으로 객체를 효율적으로 추가, 삭제, 검색할 수 있도록 관련된 인터페이스와 클래스들을 java.util 패키지에 포함시켜 놓았다. 이를 컬렉션 프레임워크(Collection Framework) 라고 한다.
list 컬렉션은 객체를 인덱스로 관리하기 때문에 객체를 저장하면 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공한다.
Linux 미션
day010 project, gt003 package, ComboBoxEx.java 출력해보기
jdk 1.5 이상에서는 다양한 타입의 객체를 다루는 메소드나 컬렉션 클래스에 컴파일 시스템의 타입을 체크하는 Generic 메커니즘이 추가됨.
따라서 자료형을 명시해주지 않으면 에러가 남.
자세한 에러를 참고하려면
javac -Xlint [filename].java
명령어를 사용하면 에러를 알 수 있다.
Windows 미션
Oracle SQL 미션
Table 이름 : SAWON
Field 이름 : 알아서 (영어)
번호 : Number
나머지 : VarChar2query 만 메일로 제출
메일 제목 : 사원테이블_홍길동