야구를 좋아하는 프로그래머
홈
글쓰기
방명록
관리자
소켓 프로그래밍
Study/NetWork
2011. 9. 29. 21:00
import java.net.*; import java.io.*; import java.util.*; import java.awt.*; import java.awt.event.*; public class GUIChatClient 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 GUIChatClient() { setTitle("채팅 클라이언트 ver 1.0"); // 제목 addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); // 자원 반납후 프레임 닫기 }// windowClosing });// X 클릭시 종료 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("127.0.0.1", 15);// 자신의 IP, 15글자 txt_name = new TextField("홍길동", 15);// 대화명, 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("", 25);// 채팅 입력 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.0", 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); // 보이기 }// 생성자 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) { e.printStackTrace(); }// catch }// run 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(); // 쓰레드 시작 -> run 메소드 실행 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(); // 채팅 입력란에 커서 놓는다. }// else if... } catch (Exception ex) { ex.printStackTrace(); }// catch }// actionPerformed public static void main(String[] args) { new GUIChatClient(); }// main }// end
import java.net.*; import java.io.*; import java.util.*; import java.awt.*; import java.awt.event.*; public class GUIChatServer extends Frame implements ActionListener { Button btnExit; TextArea ta; Vector vChatList; ServerSocket ss; Socket sockClient; public GUIChatServer() { 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, 200, 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 GUIChatServer(); }// 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
공유하기
게시글 관리
야구를 좋아하는 프로그래머
'
Study
>
NetWork
' 카테고리의 다른 글
컴퓨터 네트워크 정리
(0)
2011.09.29
Posted by
코딩하는 야구쟁이
,
코딩하는 야구쟁이
카테고리
야구쟁이
(1239)
Life
(151)
일상
(15)
힐링
(53)
교훈
(6)
상식
(3)
게임
(9)
스포츠
(52)
웃자
(13)
터틀즈
(0)
Baseball #1
(179)
MLB
(75)
KBO
(23)
NPB
(30)
역사
(33)
컬럼
(16)
후기
(2)
Baseball #2
(55)
훈련
(26)
다큐
(15)
스케치
(7)
기록
(5)
복기
(2)
Music
(395)
국내
(274)
국외
(120)
Study
(459)
IT
(12)
포트폴리오
(2)
자기소개서
(6)
IPhone Tip
(29)
SoftWare
(9)
Oracle
(44)
X-CODE
(1)
XPlatform
(10)
Velocity
(3)
C++
(30)
C#
(75)
MFC
(18)
OpenCV
(20)
ASP.NET
(4)
Android
(1)
JAVA
(42)
JQuery
(1)
Spring
(4)
iBatis
(2)
JSP
(43)
Servlet
(3)
Java Script
(8)
HTML
(3)
OpenGL
(24)
NetWork
(2)
Server
(4)
xpressEngine
(0)
VRML
(15)
은행
(0)
경영학
(40)
수학
(4)
태그목록
C#
mfc
프로야구
LA다저스
나는가수다
C언어
스포츠
김경호
WWF
신시내티
야구역사
이구리
Cortona 3D
류현진
HCI
나는 가수다
야구
프로그래밍
c++
KBO
야구동영상
데이터베이스
메이저리그
MLB
닷넷
나가수
G세대의 창업전략
3D 프로그래밍
이슈
태그를 입력해 주세요.
아이폰4
불후의 명곡
opencv
클래스
OpenGL
부산맛집
추신수
야구강좌
db
vrml
최근에 올라온 글
최근에 달린 댓글
최근에 받은 트랙백
글 보관함
링크
Powerful Programming.
DaddyGom... is S/W D….
구름처럼 흘러가는 일상.....
부산시 공식블로그 Cooooool! ….
이구리의 음악블로그.
LOVE YOURSELF MORE.
자바캔(Java Can Do IT).
까먹지말자!.
야구로그.
막군의 홀로 사는 이야기!.
까칠한 쑤.
엑스플랫폼 101.
SIMPLE IS THE BEST!.
딸기향기의 휴식시간.
kini's Sportugese.
나이스 블로그.
'SUPER HD 스포츠' 아프리카T….
서면미용실 ,미가랑헤어.
박동희기자의 스포츠 춘추.
봉명동안방극장.
mdsloved_rb님의 블로그.
한스의 맛있는 이야기.
S.F.A.R의 MLB.
사회인야구장 운영 및 개발.
DIET STORY.
엠엘비 포스트.
Simple.
Total :
Today :
Yesterday :
티스토리툴바