Java : GUI 버섯 먹기 게임 만들기

Java Programming|2018. 11. 23. 15:33
반응형

 

import java.awt.BorderLayout;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.Toolkit;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import java.util.ArrayList;

import java.util.Random;

 

import javax.swing.JFrame;

import javax.swing.JPanel;

 

public class MainFrame extends JFrame {

GamePanel panel;

GameThread gThread;

public MainFrame() {

 

setTitle("Graphic Game Test");

setDefaultCloseOperation(EXIT_ON_CLOSE);

setBounds(300, 300, 700, 700);

setResizable(false);

 

panel = new GamePanel();

add(panel,BorderLayout.CENTER);

 

setVisible(true);

//게임 진행시키는 스레드 객체 생성 및 스타트

gThread = new GameThread();

gThread.start(); //run() 메소드 자동실행!!

 

//프레임에 키보드 입력에 반응하는 keyListner 등록

addKeyListener(new KeyListener() {

@Override

public void keyTyped(KeyEvent e) {

// TODO Auto-generated method stub

반응형

}

@Override

public void keyReleased(KeyEvent e) {

//눌러진 키가 무엇인지 알아내기 

int keyCode = e.getKeyCode();

switch( keyCode ) {

case KeyEvent.VK_LEFT:

panel.dx = 0; //원랜 getsetter 만들어야함

break;

case KeyEvent.VK_RIGHT:

panel.dx = 0;

break;

case KeyEvent.VK_UP:

panel.dy = 0;

break;

case KeyEvent.VK_DOWN:

panel.dy = 0;

break;

}

//방향키 4개 구분

}

@Override

public void keyPressed(KeyEvent e) {

//눌러진 키가 무엇인지 알아내기 

int keyCode = e.getKeyCode();

switch( keyCode ) {

case KeyEvent.VK_LEFT:

panel.dx = -8; //원랜 getsetter 만들어야함

break;

case KeyEvent.VK_RIGHT:

panel.dx = 8;

break;

case KeyEvent.VK_UP:

panel.dy = -8;

break;

case KeyEvent.VK_DOWN:

panel.dy = 8;

break;

}

//방향키 4개 구분

}

});

}//생성자

 

///////////////////////////////////////////////////////

class GamePanel extends JPanel { //게임화면 그려낼 Panel

 

//화면에 보여질 이미지 객체 참조변수 - 멤버변수

Image imgBack, imgPlayer, imgEnemy;

int width, height;//패널 사이즈 가져오기

int x, y, w, h;//xy : 플레이어의 중심 좌표 / wh : 이미지 절반폭;

int dx = 0, dy = 0;//플레이어 이미지의 이동속도, 이동방향

//적군 객체 참조변수, 여러마리일수있으므로 ArrayList(유동적 배열) 활용

ArrayList<Enemy> enemies = new ArrayList<Enemy>();

 

int score; //점수

 

 

public GamePanel() {

//GUI 관련 프로그램의 편의를 위해 만들어진 도구상자(Toolkit) 객체 

Toolkit toolkit = Toolkit.getDefaultToolkit();

//생성자에서 사이즈를 구하려하면 무조건 0임, 아직 패널이 안붙어서 사이즈를 모르기때문

//width = getWidth(); 

//height = getHeight();

 

imgBack = toolkit.getImage("images/bg.png");//배경 이미지

imgPlayer = toolkit.getImage("images/ms21.png");//플레이어 이미지 객체

imgEnemy = toolkit.getImage("images/ms20.png");//적군 이미지 객체 

 

}//생성자

 

//화면에 보여질때  보여질 내용물 작업을 수행하는 메소드 : 자동 실행(콜백 메소드)

@Override

protected void paintComponent(Graphics g) {

//화면에 보여질 작업 코딩

if( width == 0 || height == 0) { //처음 호출시엔 느려서 안보이다 이후 보임

width = getWidth();

height = getHeight();

//리사이징

imgBack = imgBack.getScaledInstance(width, height, Image.SCALE_SMOOTH);

imgPlayer = imgPlayer.getScaledInstance(128, 128, Image.SCALE_SMOOTH);

x = width/2;//플레이어의 좌표 계산

y = height - 100;

w = 64;

h = 64;

}

//이곳에 화가객체가 있으므로 그림 그리는 작업은 무조건 여기서

g.drawImage(imgBack, 0, 0, this);//배경 그리기

for(Enemy t : enemies) {

g.drawImage(t.img, t.x-t.w, t.y-t.h, this);

}

 

g.drawImage(imgPlayer, x - w, y - h, this);//플레이어

g.setFont(new Font(null, Font.BOLD, 20));//점수 표시하기

g.drawString("Score : " + score,10, 30);

//여러장면 만들기 위해 일정시간마다 다시 그리기(re painting)

}//paintComponent method                                       

 

void move() { //플레이어 움직이기(좌표 변경)

//적군들 움직이기

//중간에 배열의 개수 변경될 여지가 있다면

//맨 마지막 요소부터 거꾸로 0번 요소까지 역으로 처리해야함.

for(int i = enemies.size()-1; i >= 0; i--) {

Enemy t = enemies.get(i);

t.move();

if(t.isDead)  //ArrayList에서 제거

enemies.remove(i);

}

 

//for(Enemy t : enemies) { //foreach문으론 불가 }

x += dx;

y += dy;

//플레이어 좌표가 화면 밖으로 나가지 않도록

if(x < w) x = w;

if(x > width - w) x = width - w;

if(y < h) y = h;

if(y > height - h) y = height - h;

}

 

void makeEnemy() { //적군 생성 메소드

if(width == 0 || height == 0) return;

 

Random rnd = new Random();//50번에 한번꼴로 만들기

int n = rnd.nextInt(15);

if( n == 0 ) {

enemies.add(new Enemy(imgEnemy, width, height));

}

}//makeenemy

 

//충돌체크 작업 계산 메소드

void checkCollision() { //플레이어와 적군의 충돌

 

for(Enemy t : enemies) {

int left = t.x - t.w;

int right = t.x + t.w;

int top = t.y - t.h;

int bottom = t.y + t.h;

 

if(x > left && x < right && y > top && y < bottom) {

t.isDead = true; //충돌했음

score += 5;

}

}

}

 

}//GamePanel class

///////////////////////////////////////////////////////

//일정 시간마다 개엠화면을 갱신시키는 작업 수행하는 별도 스레드 클래스

class GameThread extends Thread {

@Override

public void run() {

while(true) {

//적군 객체 만들어내는 기능 메소드 호출

panel.makeEnemy();

//GamePanel의 플레이어 좌표 변경 

//panel.x += -1;// 객체의 멤버값 변경은

//panel.y += -5;/// 그 객체가 스스로 하도록 하는것이 OOP이 기본 모티브

panel.move();

panel.checkCollision();//충돌 체크 기능 호출

panel.repaint();//GamePanel의 화면 갱신

try { //너무 빨리 돌아서 천천히 돌도록

sleep(20);

} catch (InterruptedException e) {}

}

}

}

 

public static void main(String[] args) {

new MainFrame();

}

 

}

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡEnemy classㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

import java.awt.Image;

import java.util.Random;

 

public class Enemy {

 

Image img; //이미지 참조변수

int x, y; //이미지 중심 좌표

int w, h; //이미지 절반폭, 절반높이

 

int dy; //적군의 변화량

 

int width, height; //화면(panel)의 사이즈

//본인 객체가 죽었는지 여부!

boolean isDead = false;

 

public Enemy(Image imgEnemy, int width, int height) {

this.width = width;

this.height = height;

 

//멤버변수 값 초기화..

img = imgEnemy.getScaledInstance(64, 64, Image.SCALE_SMOOTH);

w = 32; //이미지 절반넓이

h = 32;

 

Random rnd = new Random();

x = rnd.nextInt(width - w * 2) + w; //w ~ width - w

y = -h;

 

dy =+ rnd.nextInt(15) + 1;//떨어지는 속도 랜덤하게

}

 

void move() { //Enemy의 움직이는 기능 메소드

y += dy;

//만약 화면 밑으로 나가버리면 객체 없애기

if( y > height + h ) { //ArrayList에서 제거

isDead = true; //죽음 표식! 

}

}

}

반응형

Java : 예외처리(Exception)에 대해 알아보기

Java Programming|2018. 11. 22. 20:56
반응형

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.net.MalformedURLException;

import java.net.URL;

import java.util.InputMismatchException;

import java.util.Scanner;


public class Main {


public static void main(String[] args) {

// TODO Auto-generated method stub

//1. Error : 실행불가!!

//2. Exception : 실행중(RunTime) 문제가 발생!!

//Exception의 대표적인 예)

//1) 사용자가 잘못된 데이터를 입력하는 경우 : 숫자입력상황에 문자입력..등..

//2) 개발자가 로직이나 계산을 잘못한 경우 : 배열의 인덱스번호 오류, or 0으로 나눗셈.

//3) 네트워크나 하드웨어 오류 (하드디스크의 파일제어 오류.. 특정사이트(서버)접속 오류 : URL 미스, 사이트서버 불량)

//4) ?? 악의적인 과부하에 의한 오류(디도스 공격) : 해결이 어려움!!

System.out.println("예외처리에 대해 알아봅시다.");

//위의 예외상황에 대응하는 문법 소개..

//int a=0;

//System.out.println( 10/a );

//예외가 발생하면 그 순간 프로그램이 다운됨!!

//이를 방지할 필요가 있음..즉, 문제가 생기는 부분만 실행하지 않고 다음 코드를 계속 실행하도록!!

//if를 이용해서 a값이 0인 검사해보고 나눗셈을 실행할지 여부를 결정할 수 있음.

//경우에 따라서는 일단 시도를 해보고 예외가 발생하면 그에 대응해야 하는 경우도 있음.

//예): 인터넷 사이트에 접속하는 경우(www.naver.com): 접속은 해보는데 그 서버문제로 접속이 안되는 경우!

//이럴 경우 예외처리 문법이 유용함!! 프로그래머들에게는 필수 기술!!

//1) 0으로 나눗셈..

int a=0;

try {//일단 한번 시도해보는 영역 : 예외가 발생될 여지가 있는 코드들 작성 영역

System.out.println( 10/a );

}catch( ArithmeticException e ) {

//에러가 발생할 때 실행할 코드들..

System.out.println("에러가 발생했습니다");

System.out.println("에러메세지 : "+ e.getMessage() );

System.out.println("에러메세지 풀버전: "+ e.toString() );

}

//2) 배열의 인덱스 번호 사용 오류..

int[] arr= new int[5];

try {

//에러가 발생할 여지가 있는 코드는 try{ .. } 안에 작성!!

for(int i=0; i<6; i++) {

System.out.println( arr[i] );

}

}catch( ArrayIndexOutOfBoundsException e ) {

System.out.println("에러!!!");

}

//3) null참조변수로 객체 메소드 사용.(가장 많이발생..)

String s= null;

try {

System.out.println( s.length() );

}catch( NullPointerException e ) {

System.out.println("null 에러!! : 객체 없어!!!!");

}

//4) 잘못된 데이터를 입력!!

Scanner scanner= new Scanner(System.in);

int n;

try {

// n= scanner.nextInt();

// System.out.println(" n : " + n );

}catch( InputMismatchException e ) {

System.out.println(" 정수만 입력해!!! ");

}

//5) 숫자로 바꿀 수 없는 데이터를 숫자로 바꾸고자 할때!!

// String str= scanner.next(); //문자열 입력

//문자열을 int형으로 변환하기!

try {

// int num= Integer.parseInt(str);

// System.out.println(" num : " + num);

}catch( NumberFormatException e) {

System.out.println("정수형 문자열이 아니여서 변환 불가!");

}

//예외가 한번에 여러가지 발생하는 경우도 있음!!!

//예) 두 수를 입력받아 나눗셈을 하는 프로그램..

//예외 안에 중첩으로 예외 필요..

int c, d;

try {

// c= scanner.nextInt();

// d= scanner.nextInt();

//

// try {

//

// System.out.println( c/d ); //d가 0인 문제가 있을 수 있음.

//

// }catch( ArithmeticException e) {

// System.out.println("수학적 오류 : 0 나눗셈");

// }

}catch( InputMismatchException e ) {

System.out.println("정수가 아닌 값 입력 에러!!");

}

//중첩에 중첩.....중첩..이거 좀 짜증

//if else중첩 대신에  if else if문..

//다중 catch문으로 간결하게 처리하기!!

try {

// c= scanner.nextInt();

// d= scanner.nextInt();

//

// System.out.println( c/d );

}catch( InputMismatchException e) {

System.out.println("정수가 아닌값을 입력!");

}catch( ArithmeticException e) {

System.out.println("수학오류 : 0나눗셈");

}

//멀티catch문은 개수제한이 없음.

//만약 에러상황마다 대처할 내용은 똑같다면. 굳이 여러개의 catch문을

//반복적으로 작성하는 것은 낭비!!

//예외클래스들의 최상위 클래스인 Exception으로 모든 종류의 Exception객체를 catch할 수 있음.

try {

// c= scanner.nextInt();

// d= scanner.nextInt();

//

// System.out.println( c/d );

}catch( Exception e) {

System.out.println("에러!!!");

}

//예외발생 여부와 상관없이 무조건 할 일이 있다면...??

//보통 사용예)메모리를 관리하거나 외부(서버, 파일)와 연결통로 종료시키는 코드들..작성!

int x=0;

try {

System.out.println(10/x);

System.out.println("계산성공");

}catch(ArithmeticException e) {

System.out.println("계산실패");

}finally {

//여기는 무조건 실행되는 영역!!!

System.out.println("여긴 무조건 실행");

}

//가만 보니..finally를 안써도..어차피 cath{}다음 줄이 실행됨!!

//그럼 어차피 무조건 실행되는 코드작성 가능함!! 

//만약, 그냥쓰면 위의 try- catch문과는 상관없는 코드인것 처럼 인식될 가능성이 더 많음.

//finally를 쓰게되면 catch문을 안써도 됨.

try {

}finally {}

//Exception의 2가지 분류!

//1. Checked Exception : 예외처리를 안하면 에러가 발생하여 실행조차도 못하는 예외들!!

//2. UnChecked Exception : 예외처리(try문)을 해도되고 안해도 되는 예외들...지금까지 봤던 저 위의 예외들..

//Checked Exception의 대표적인 것들..:반드시 예외처리해야만 사용가능!

try {

//URL url= new URL("http://www.naver.com");//예외처리를 안하면 실행도 안되는 기능!!

URL url= new URL("www.naver.com");//주소오류: http://없어서..

System.out.println("서버접속 완료!!");

}catch( MalformedURLException e ) {

System.out.println("서버 주소에 이상이 있습니다.");

}

File file= new File("D://aaa.txt");

try {

//예외처리를 안하면 에러나는 코드들!

FileInputStream fis= new FileInputStream(file);

System.out.println("파일접속 성공");

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

System.out.println("파일접속 실패. 파일을 찾을 수 없습니다.");

}

System.out.println();

System.out.println("aaaa");


}


}



반응형

Java : GUI, 네트워크(1:1 채팅 프로그램 만들기)

Java Programming|2018. 11. 22. 15:09
반응형

MainFrame


import java.awt.BorderLayout;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;


import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;


public class MainFrame extends JFrame {

public MainFrame() {

setTitle("Swing TCP Chatting Test");

setBounds(10, 50, 400, 250);

setDefaultCloseOperation(EXIT_ON_CLOSE);

JPanel panel = new JPanel();

panel.setLayout(new GridLayout(0, 2));

JButton btnServer = new JButton("Server");

JButton btnClient = new JButton("Client");

//버튼클릭 액션에 반응하기 위해 리스너 객체 생성 및 추가

btnServer.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

//ServerFrame 객체 생성

ServerFrame frame = new ServerFrame();

}

});

btnClient.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

//ClientFrame 객체 생성

ClientFrame frame = new ClientFrame();

}

});

panel.add(btnServer);

panel.add(btnClient);

add(panel, BorderLayout.CENTER);

setVisible(true);

}


public static void main(String[] args) {

new MainFrame();

}

}


ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

ServerFrame


import java.awt.BorderLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.net.ServerSocket;

import java.net.Socket;


import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import javax.swing.JTextField;


public class ServerFrame extends JFrame {

JTextArea textArea; //멤버 참조변수

JTextField tfMsg;

JButton btnSend;

ServerSocket serverSocket;

Socket socket;

DataInputStream dis;

DataOutputStream dos;

public ServerFrame() {

setTitle("Server");

setBounds(450, 50, 500, 350);

textArea = new JTextArea();

textArea.setEditable(false); //쓰기 금지

JScrollPane scrollPane = new JScrollPane(textArea);

add(scrollPane,BorderLayout.CENTER);

JPanel msgPanel = new JPanel();

msgPanel.setLayout(new BorderLayout());

tfMsg = new JTextField();

btnSend = new JButton("send");

msgPanel.add(tfMsg, BorderLayout.CENTER);

msgPanel.add(btnSend, BorderLayout.EAST);

add(msgPanel,BorderLayout.SOUTH);

//send 버튼 클릭에 반응하는 리스너 추가

btnSend.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

sendMessage();

}

});

//엔터키 눌렀을 때 반응하기

tfMsg.addKeyListener(new KeyAdapter() {

//키보드에서 키 하나를 눌렀을때 자동으로 실행되는 메소드..: 콜백 메소드

@Override

public void keyPressed(KeyEvent e) {

super.keyPressed(e);

//입력받은 키가 엔터인지 알아내기, KeyEvent 객체가 키에대한 정보 갖고있음

int keyCode = e.getKeyCode();

switch(keyCode) {

case KeyEvent.VK_ENTER:

sendMessage();

break;

}

}

});

setVisible(true);

tfMsg.requestFocus();

//상대방이 접속할 수 있도록 서버소켓을 만들고 통신할 수 있는 준비 작업!

//네트워크 작업을 Main Thread가 하게하면 다른 작업(키보드 입력, 클릭 등..)들을 

//전혀 할 수 없음, 프로그램이 멈춤, 그래서 Main은 UI작업에 전념하도록 하고, 

//다른 작업들(오래 걸리는)은  별도의 Thread에게 위임하는 것이 적절함.

ServerThread serverThread = new ServerThread();

serverThread.setDaemon(true); //메인 끝나면 같이 종료

serverThread.start();

addWindowListener(new WindowAdapter() {

@Override //클라이언트 프레임에 window(창) 관련 리스너 추가

public void windowClosing(WindowEvent e) {

super.windowClosing(e);

try {

if(dos != null) dos.close();

if(dis != null) dis.close();

if(socket != null) socket.close();

if(serverSocket != null) serverSocket.close();

} catch (IOException e1) {

e1.printStackTrace();

}

}

});

}//생성자 메소드

//이너클래스 : 서버소켓을 생성하고 클라이언트의 연결을 대기하고,

//연결되면 메시지를 지속적으로 받는 역할 수행

class ServerThread extends Thread {

@Override

public void run() {

try {  //서버 소켓 생성 작업

serverSocket = new ServerSocket(10001);

textArea.append("서버소켓이 준비됐습니다...\n");

textArea.append("클라이언트의 접속을 기다립니다.\n");

socket = serverSocket.accept();//클라이언트가 접속할때까지 커서(스레드)가 대기

textArea.append(socket.getInetAddress().getHostAddress() + "님이 접속하셨습니다.\n");

//통신을 위한 스트림 생성

dis = new DataInputStream(socket.getInputStream());

dos = new DataOutputStream(socket.getOutputStream());

while(true) {

//상대방이 보내온 데이터를 읽기

String msg = dis.readUTF();//상대방이 보낼때까지 대기

textArea.append(" [Clinent] : " + msg + "\n");

textArea.setCaretPosition(textArea.getText().length());

}

} catch (IOException e) {

textArea.append("클라이언트가 나갔습니다.\n");

}

}

}

//메시지 전송하는 기능 메소드

void sendMessage() {

String msg = tfMsg.getText(); //TextField에 써있는 글씨를 얻어오기

tfMsg.setText(""); //입력 후 빈칸으로

textArea.append(" [SERVER] : " + msg + "\n");//1.TextArea(채팅창)에 표시

textArea.setCaretPosition(textArea.getText().length()); //스크롤 따라가게

//2.상대방(Client)에게 메시지 전송하기

Thread t = new Thread() {

@Override

public void run() {

try {

dos.writeUTF(msg);

dos.flush();

} catch (IOException e) {

e.printStackTrace();

}

}

};

t.start();

}

}//class


/*if (tfMsg.getText().contains("강아지")) {  //비속어 필터

String s = textArea.getText().replace("강아지", "****");

tfMsg.setText(s);

} */

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


ClientFrame


import java.awt.BorderLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.Socket;

import java.net.UnknownHostException;


import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import javax.swing.JTextField;


public class ClientFrame extends JFrame{

JTextArea textArea; //멤버 참조변수

JTextField tfMsg;

JButton btnSend;

Socket socket;

DataInputStream dis;

DataOutputStream dos;

public ClientFrame() {

setTitle("Client");

setBounds(450, 400, 500, 350);

textArea = new JTextArea();

textArea.setEditable(false); //쓰기 금지

JScrollPane scrollPane = new JScrollPane(textArea);

add(scrollPane,BorderLayout.CENTER);

JPanel msgPanel = new JPanel();

msgPanel.setLayout(new BorderLayout());

tfMsg = new JTextField();

btnSend = new JButton("send");

msgPanel.add(tfMsg, BorderLayout.CENTER);

msgPanel.add(btnSend, BorderLayout.EAST);

add(msgPanel,BorderLayout.SOUTH);

//send 버튼 클릭에 반응하는 리스너 추가

btnSend.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

sendMessage();

}

});

//엔터키 눌렀을 때 반응하기

tfMsg.addKeyListener(new KeyAdapter() {

//키보드에서 키 하나를 눌렀을때 자동으로 실행되는 메소드..: 콜백 메소드

@Override

public void keyPressed(KeyEvent e) {

super.keyPressed(e);

//입력받은 키가 엔터인지 알아내기, KeyEvent 객체가 키에대한 정보 갖고있음

int keyCode = e.getKeyCode();

switch(keyCode) {

case KeyEvent.VK_ENTER:

sendMessage();

break;

}

}

});

setVisible(true);

tfMsg.requestFocus();

//서버와 연결하는 네트워크 작업 : 스레드 객체 생성 및 실행

ClientThread clientThread = new ClientThread();

clientThread.setDaemon(true);

clientThread.start();

addWindowListener(new WindowAdapter() {

@Override //클라이언트 프레임에 window(창) 관련 리스너 추가

public void windowClosing(WindowEvent e) {

super.windowClosing(e);

try {

if(dos != null) dos.close();

if(dis != null) dis.close();

if(socket != null) socket.close();

} catch (IOException e1) {

e1.printStackTrace();

}

}

});

}//생성자

//이너클래스 : 서버와 연결하는 네트워크 작업 스레드

class ClientThread extends Thread {

@Override

public void run() {

try {

socket = new Socket("  접속 IP 주소  ", 10001);

textArea.append("서버에 접속됐습니다.\n");

//데이터 전송을 위한 스트림 생성(입추력 모두)

InputStream is = socket.getInputStream();

OutputStream os = socket.getOutputStream();

//보조스트림으로 만들어서 데이터전송 작업을 편하게 ※다른 보조스트림 사용

dis = new DataInputStream(is);

dos = new DataOutputStream(os);

while(true) {//상대방 메시지 받기

String msg = dis.readUTF();

textArea.append(" [SERVER] : " + msg + "\n");

textArea.setCaretPosition(textArea.getText().length());

}

} catch (UnknownHostException e) {

textArea.append("서버 주소가 이상합니다.\n");

} catch (IOException e) {

textArea.append("서버와 연결이 끊겼습니다.\n");

}

}

}

//메시지 전송하는 기능 메소드

void sendMessage() {

String msg = tfMsg.getText(); //TextField에 써있는 글씨를 얻어오기

tfMsg.setText(""); //입력 후 빈칸으로

textArea.append(" [Clinet] : " + msg + "\n");//1.TextArea(채팅창)에 표시

textArea.setCaretPosition(textArea.getText().length());

//2.상대방(Server)에게 메시지 전송하기

//아웃풋 스트림을 통해 상대방에 데이터 전송

//네트워크 작업은 별도의 Thread가 하는 것이 좋음

Thread t = new Thread() {

@Override

public void run() {

try { //UTF = 유니코드의 규약(포맷), 한글 깨지지 않게 해줌

dos.writeUTF(msg);

dos.flush(); //계속 채팅 위해 close()하면 안됨

} catch (IOException e) {

e.printStackTrace();

}

}

};

t.start();

}

}//class

반응형

Java : GUI 회원 명단 추가삭제 프로그램(Table 등)

Java Programming|2018. 11. 21. 20:15
반응형

import java.awt.BorderLayout;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.ArrayList;

 

import javax.swing.ButtonGroup;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JRadioButton;

import javax.swing.JScrollPane;

import javax.swing.JTable;

import javax.swing.JTextField;

import javax.swing.table.DefaultTableModel;

 

public class TableTest2 extends JFrame {

 

ArrayList<MemberVO> members = new ArrayList<MemberVO>();

 

public TableTest2() {

 

setTitle("회원 명단 추가삭제 프로그램");

setDefaultCloseOperation(EXIT_ON_CLOSE);

setAlwaysOnTop(true);

setBounds(200, 100, 400, 200);

반응형

//표 제목줄

String[] colNames = new String[] {"Name", "Age", "Gender"};

//표에 들어갈 데이터들.. /처음엔 빈 테이블 만들기 위해.. 데이터관리객체 생성

DefaultTableModel model = new DefaultTableModel(colNames, 0);

 

JTable table = new JTable(model);

JScrollPane scrollPane = new JScrollPane(table);

add(scrollPane, BorderLayout.CENTER);

 

//테이블 아래쪽에 데이터 입력 할수있는 패널

JPanel bottomPanel = new JPanel();

bottomPanel.setLayout(new GridLayout(2, 1));

 

JPanel panel = new JPanel();

JTextField tfName = new JTextField(6);

JTextField tfAge = new JTextField(3);

JRadioButton rb1 = new JRadioButton("Female");

JRadioButton rb2 = new JRadioButton("male");

JRadioButton rb3 = new JRadioButton();

ButtonGroup rg = new ButtonGroup();

rg.add(rb1); rg.add(rb2); rg.add(rb3);

rb1.setSelected(true);

 

panel.add(new JLabel("NAME"));

panel.add(tfName);

panel.add(new JLabel("AGE"));

panel.add(tfAge);

panel.add(rb1); panel.add(rb2);

bottomPanel.add(panel);

 

JPanel panel2 = new JPanel();

JButton btnAdd = new JButton("Add");

JButton btnDel = new JButton("Delete");

panel2.add(btnAdd); panel2.add(btnDel);

bottomPanel.add(panel2);

 

btnAdd.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

//입력된 값 테이블에 추가하기

//입력된 값들을 한줄 데이터 덩어리(배열)로 만들어줘야 함    ←←←

String[] rows = new String[3];

rows[0] = tfName.getText();

rows[1] = tfAge.getText();

if(rb1.isSelected()) rows[2] = "female";

else rows[2] = "male";

model.addRow(rows); //한줄단위로만 대입 가능하므로↑↑

 

//입력후 텍스트 필드 값 제거

tfName.setText("");

tfAge.setText("");

rb3.setSelected(true); //라디오 초기화

 

//어레이 리스트에 멤버 객체 추가

String name = rows[0];

int age = Integer.parseInt(rows[1]);

String gender = rows[2];

members.add(new MemberVO(name, age, gender));

System.out.println("회원 숫자:" + members.size());

}

});

//선택한 줄 지우기

btnDel.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

//선택한 줄(row)의 번호 알아내기

int rowIndex = table.getSelectedRow();

//선택 안하고 누를 경우 리턴값 -1

if(rowIndex == -1) return;

model.removeRow(rowIndex);

 

members.remove(rowIndex); //데이터 지우기

System.out.println("회원 숫자:" + members.size());

}

});

 

add(bottomPanel,BorderLayout.SOUTH);

setVisible(true);

}

class MemberVO { //회원 1명 정보 저장하는 클래스 : 오로지 데이터 저장용

private String name;  //VO클래스

private int age;

private String gender;

public MemberVO(String name, int age, String gender) {

this.name = name;

this.age = age;

this.gender = gender;

}

}

 

public static void main(String[] args) {

new TableTest2();

}

}

 

 

반응형

Java : GUI, 메뉴 만들기

Java Programming|2018. 11. 21. 13:57
반응형

 메뉴 아이콘, 서브메뉴, 체크, 라디오버튼 만드는 자바 코드입니다.


결과창입니다.



import java.awt.BorderLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyEvent;


import javax.swing.ImageIcon;

import javax.swing.JCheckBoxMenuItem;

import javax.swing.JFrame;

import javax.swing.JMenu;

import javax.swing.JMenuBar;

import javax.swing.JMenuItem;

import javax.swing.JRadioButtonMenuItem;

import javax.swing.JTextField;


public class ManuBarTest extends JFrame {

JTextField tf;

public ManuBarTest() {

JMenuBar menuBar = new JMenuBar(); //메뉴바 생성

JMenu menu1 = new JMenu("File"); //메뉴 생성

JMenu menu2 = new JMenu("Edit");

menuBar.add(menu1);

menuBar.add(menu2);

JMenuItem menuItem = null; //서브메뉴

//메뉴1("File")의 서브메뉴 생성 및 추가, 메뉴선택 리스너

menuItem = new JMenuItem("New");

menuItem.addActionListener(menuItemListener);

menuItem.setToolTipText("새로만들기를 합니다.");

menu1.add(menuItem);

//단축키 지정

menuItem = new JMenuItem("Open",KeyEvent.VK_O); //O밑에 밑줄 및 키이벤트 등록

menuItem.addActionListener(menuItemListener);

menu1.add(menuItem);

menuItem = new JMenuItem("Save");

menuItem.setIcon(new ImageIcon("images/edit.png"));//아이콘 16x16

menuItem.addActionListener(menuItemListener);

menu1.add(menuItem);

//서브메뉴

JMenu subMenu = new JMenu("sub menu");

menuItem = new JMenuItem("sub1");

menuItem.addActionListener(menuItemListener);

subMenu.add(menuItem);

menuItem = new JMenuItem("sub2");

menuItem.addActionListener(menuItemListener);

subMenu.add(menuItem);

menu1.add(subMenu);

//Menu2("Edit")의 서브메뉴 만들기

JCheckBoxMenuItem checkBoxMenuItem = new JCheckBoxMenuItem("Ruler");

checkBoxMenuItem.addActionListener(menuItemListener);

checkBoxMenuItem.setToolTipText("눈금자를 보이게함");//툴팁

menu2.add(checkBoxMenuItem);

menu2.addSeparator();//구분선

//라디오 버튼

JRadioButtonMenuItem radioButtonMenuItem = new JRadioButtonMenuItem("Ediable");

radioButtonMenuItem.addActionListener(menuItemListener);

menu2.add(radioButtonMenuItem);

//JFrame에 메뉴바 설정

setJMenuBar(menuBar);

//메뉴 선택시의 결과 출력용 JTextField

tf = new JTextField();

tf.setToolTipText("선택한 결과가 출력됩니다.");

add(tf,BorderLayout.SOUTH);

setDefaultCloseOperation(EXIT_ON_CLOSE);

setBounds(200,300,300,200);

setAlwaysOnTop(true);

setTitle("Menu Test");

setVisible(true);

}

ActionListener menuItemListener = new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

tf.setText(e.getActionCommand()+"를 선택함.");

}

};


public static void main(String[] args) {

new ManuBarTest();


}


}


반응형

Java : GUI, 리스트뷰(List View), 클릭한 이미지만 보이게 하기

Java Programming|2018. 11. 21. 10:05
반응형

결과화면 



클릭하면 한개 그림만 보입니다.



import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.GridLayout;

import java.awt.Image;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;


import javax.swing.ImageIcon;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JList;

import javax.swing.JPanel;

import javax.swing.event.ListSelectionEvent;

import javax.swing.event.ListSelectionListener;


public class ListTest extends JFrame{

//리스트에 보여질 항목들

String[] datas = new String[] 

{"Char1","Char2","Char3","Char4","Char5","Char6"};

JList<String> list = new JList<String>(); //명시적 초기화

public ListTest() {

list.setListData(datas);  //리스트 객체의 설정과 항목들 설정

list.setSelectionBackground(Color.YELLOW);

list.setSelectionForeground(Color.RED);

add(list,BorderLayout.WEST);

//가운데 이미지 배치 영역

JPanel panel = new JPanel();

panel.setLayout(new GridLayout(3, 2, 5, 5)); //row,col,hgap,vgap

JLabel[] imgLabels = new JLabel[6]; //배열 객체 생성

for(int i = 0; i < imgLabels.length; i++) {

//이미지 아이콘 객체 생성

ImageIcon icon = new ImageIcon("images/ms1" + (i + 2) + ".png");

icon = new ImageIcon( icon.getImage()

.getScaledInstance(64, 64, Image.SCALE_SMOOTH));//Resizing

imgLabels[i] = new JLabel(icon); // 만들때 icon 넣을 수 있음

panel.add(imgLabels[i]); //만들며 붙이기

}

add(panel, BorderLayout.CENTER);

//리스트의 항목을 선택하는 것을 듣는 리스터 객체 생성 및 추가

list.addListSelectionListener(new ListSelectionListener() {

@Override //리스트의 항목 선택시 자동 실행되는 메소드 : 콜백메소드

public void valueChanged(ListSelectionEvent e) {

//리스트에게 선택된 항목의 인덱스번호 얻어오기

int index = list.getSelectedIndex();

for(JLabel t : imgLabels) t.setVisible(false);

imgLabels[index].setVisible(true);

}

});

JButton btn = new JButton("START");

add(btn,BorderLayout.NORTH);

btn.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

for(JLabel t : imgLabels) t.setVisible(false);

}

});

setTitle("List Test");

setLocation(600, 100);

setDefaultCloseOperation(EXIT_ON_CLOSE);

setSize(300, 300);

setVisible(true);

}

public static void main(String[] args) {

new ListTest();

}

}



반응형

Java : GUI, 체크박스(Check Box), Radio 버튼, ComboBox 만들기

Java Programming|2018. 11. 20. 15:40
반응형

결과입니다.


import java.awt.BorderLayout;

import java.awt.Dimension;

import java.awt.GridLayout;

import java.awt.Image;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.ItemEvent;

import java.awt.event.ItemListener;


import javax.swing.ButtonGroup;

import javax.swing.ImageIcon;

import javax.swing.JCheckBox;

import javax.swing.JComboBox;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JRadioButton;

import javax.swing.JTextField;


public class CompoundButtonTest extends JFrame {

JCheckBox cb1, cb2, cb3;

JTextField cb_tf;

JRadioButton rb1, rb2, rb3;

JTextField rb_tf;

public CompoundButtonTest() {

setTitle("복합버튼 테스트");

setDefaultCloseOperation(EXIT_ON_CLOSE);

setPreferredSize(new Dimension(350, 500));

//1.Check Box :

JPanel cbPanel = new JPanel();

cbPanel.setLayout(new GridLayout(2, 1));

JPanel panel = new JPanel();

cb1 = new JCheckBox("Apple");

cb2 = new JCheckBox("Banana");

cb3 = new JCheckBox("Orange");

panel.add(cb1);

panel.add(cb2);

panel.add(cb3);

cbPanel.add(panel);

JPanel panel2 = new JPanel();

cb_tf = new JTextField(15);

panel2.add(cb_tf);

cbPanel.add(panel2);

add(cbPanel,BorderLayout.NORTH);

//체크박스 상태 변경 듣는 리스너 추가

cb1.addItemListener(itemListener);

cb2.addItemListener(itemListener);

cb3.addItemListener(itemListener);

//2.Radio : 

JPanel rbPanel = new JPanel();

rbPanel.setLayout(new GridLayout(2, 1));

JPanel panel3 = new JPanel();

rb1 = new JRadioButton("Korea");

rb2 = new JRadioButton("China");

rb3 = new JRadioButton("Japan");

panel3.add(rb1); panel3.add(rb2); panel3.add(rb3);

//라디오버튼 그릅화

ButtonGroup rg = new ButtonGroup();

rg.add(rb1); rg.add(rb2); rg.add(rb3);

JPanel panel4 = new JPanel();

rb_tf = new JTextField(15);

panel4.add(rb_tf);

rbPanel.add(panel3);

rbPanel.add(panel4);

add(rbPanel,BorderLayout.SOUTH);

//라디오버튼 클릭시 글씨 출력위한 리스너 추가

rb1.addActionListener(rbListener);

rb2.addActionListener(rbListener);

rb3.addActionListener(rbListener);

//3.ComboBox 밑에 이미지 넣기

JPanel centerPanel = new JPanel();

centerPanel.setLayout(new BorderLayout());

JPanel comboPanel = new JPanel();

JComboBox<String> comboBox = new JComboBox<String>();  //보통 String사용

comboBox.addItem("character 1");

comboBox.addItem("character 2");

comboBox.addItem("character 3");

comboBox.addItem("character 4");

comboBox.addItem("character 5");

comboPanel.add(comboBox);

///이미지 보여주기 위한 컴포넌트

ImageIcon icon = new ImageIcon("images/ms_01.png");

icon = new ImageIcon( icon.getImage()

.getScaledInstance(256, 256, Image.SCALE_SMOOTH));

JLabel label = new JLabel(icon); //생성자에 아이콘 지정 가능

centerPanel.add(comboPanel,BorderLayout.NORTH);

centerPanel.add(label,BorderLayout.CENTER);

add(centerPanel, BorderLayout.CENTER); //프레임에 붙이기

//콤보박스에 리스너 붙이기

comboBox.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

System.out.println(comboBox.getSelectedItem());

int index = comboBox.getSelectedIndex();

ImageIcon icon = new ImageIcon("images/ms_0" + (1+index) + ".png");

icon = new ImageIcon( icon.getImage()

.getScaledInstance(256, 256, Image.SCALE_SMOOTH));

label.setIcon(icon);

}

});

pack();

setLocation(600, 100);

setVisible(true);

}//생성자

//Radio 버튼 리스너 객체 생성

ActionListener rbListener = new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

String str = e.getActionCommand();

//컴포넌트에 써있는 글씨 리턴

rb_tf.setText(str);

}

};

//CheckBox의 체크상태 변경 듣는 리스너 객체 생성 - 필드 위치

ItemListener itemListener = new ItemListener() {

@Override

public void itemStateChanged(ItemEvent e) {

//체크박스들의 체크상태를 확인하여 true면 써있는 글씰 얻어와서 

//TextField에 보여주기

String str = "";

if( cb1.isSelected() ) str = str + cb1.getText();

if( cb2.isSelected() ) str = str + cb2.getText();

if( cb3.isSelected() ) str = str + cb3.getText();

cb_tf.setText(str);

}

};

public static void main(String[] args) {

// TODO Auto-generated method stub

new CompoundButtonTest();


}


}



반응형

Java : Swing 버튼과 이미지 띄우기

Java Programming|2018. 11. 19. 11:59
반응형

public class Main {

public static void main(String[] args) {

JFrame frame = new JFrame("Swing GUI"); //1.최상위 컨테이너 생성

frame.setSize(500, 600); //사이즈

JButton b1 = new JButton("btn1"); //2.컴포넌트들 추가하기

JButton b2 = new JButton("button2");

//기본적으로 JFrame은 BorderLayout이란 배치관리자로 돼 있음

//가장 쉬운 레이아웃 매니저인 FlowLayout으로 변경

frame.setLayout(new FlowLayout());

frame.add(b1);  //컨테이너에 컴포넌트 추가

frame.add(b2);

//JLabel - 글씨 보여주는 컴포넌트

JLabel label = new JLabel("This is Label");

//label.setSize(100, 150);  //FlowLayout안에선 사이즈지정 안됨

frame.add(label);

//JTextField - 사용자로부터 글씨 입력받는 컴포넌트

JTextField tf = new JTextField(20);

frame.add(tf);

//이미지 - 이미지용 컴포넌트는 없음

//JLabel에 이미지(아이콘)를 보여줄 수 있는 능력을 활용

ImageIcon icon = new ImageIcon("images/ms21.png"); //이미지 아이콘 객체 생성

//이미지를 실제로 갖고 있는 Image객체 뽑아오기

Image im = icon.getImage(); //뽑아온 이미지 객체 사이즈를 새롭게 만들기!

Image im2 = im.getScaledInstance(250, 250, Image.SCALE_DEFAULT);

//새로 조절된 사이즈의 이미지(im2)를 가지는 ImageIcon 객체를 다시 생성

ImageIcon icon2 = new ImageIcon(im2);

JLabel img = new JLabel(icon2);

/*JLabel img = new JLabel();

img.setIcon(icon2);*/

frame.add(img);

반응형

//Swing은 frame창은 X버튼 누르면 자동으로 사라지지만 프로그램은 종료되지 않음.

//X버튼 누르면 프로그램도 종료되도록 설정

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setLocation(300, 200);  //위치 지정

frame.setVisible(true); //화면에 보이기

}

}

 

결과

 

 

반응형

Java : AWT 창 띄우고 버튼 만들기

Java Programming|2018. 11. 19. 11:03
반응형

public class Main {

public static void main(String[] args) {

Frame f = new Frame("GUI TEST");  //최상위 컨테이너 객체 생성

f.setSize(500, 400);  //사이즈 

// X 버튼 클릭 종료하게 하기  //콜백 메소드

WindowAdapter adapter = new WindowAdapter() {

//WindowAdapter는 WindowListner를 상속받음

@Override

public void windowClosing(WindowEvent e) {

f.dispose(); //이 프레임 창(window)를 없애기

}

};

f.addWindowListener(adapter);

//버튼 만들기, 컨테이너 안에 놓여질 컴포넌트(구성요소)들을 배치

Button btn = new Button("확인");  //컴포넌트 1개 생성

Button btn2 = new Button("취소");

Button btn3 = new Button("Hello World");

//btn3번 클릭시 글씨 변경하기, btn3 객체가 클릭됐는지 바라보고 있는 감시 객체 생성 및 붙여주기

btn3.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

btn3.setLabel("Nice Java");

}

});

//컴퓨넌트 배치를 어떻게 할지 결정하는 LayoutManager 객체 생성

FlowLayout layout = new FlowLayout(); //차례로 옆으로 배치

f.setLayout(layout);

//만들어진 버튼을 컨테이너(Frame)에 추가!

f.add(btn);

f.add(btn2);

f.add(btn3);

f.setVisible(true); //화면에 보이게

}

}


결과창입니다.


반응형

Java Networking : TCP로 서버와 클라이언트 간, 메시지 주고받기

Java Programming|2018. 11. 16. 16:56
반응형

 학원에서배운 서버와 클라이언트 구축하여 메시지 주고받는 소스입니다.


아래는 서버 소스입니다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.InetAddress;

import java.net.ServerSocket;

import java.net.Socket;

import java.net.UnknownHostException;


public class ServerTest {


public static void main(String[] args) {

// TODO Auto-generated method stub

//통신을 하려면 일단 IP주소는 알아야함.

//자바에서 IP주소에 관련된 정보를 가지고 있는 클래스 : InetAddress

//본인의 IP주소를 확인할 수 있는 방법

try {

System.out.println( InetAddress.getLocalHost().getHostAddress() );

System.out.println( InetAddress.getLocalHost().getHostName() );

System.out.println( InetAddress.getLoopbackAddress().toString() );

} catch (UnknownHostException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

//통신을 구현하려면 2가지 용어를 알아야함.

//1. IP주소 - 그 컴퓨터의 고유한 주소(숫자): 4억개

//2. port번호 - 그 컴퓨터 안에서의 프로그램 분류번호(65천개) 0~65535 : 0~1024까지는 사용하지 마세요.

//ex) 부산항(IP주소), 3번항구(port번호)

//서버 프로그램으로서의 작업

//1. 서버소켓을 만들어 놓는 작업!

try {

ServerSocket serverSocket= new ServerSocket(10001);

System.out.println("서버소켓이 생성되었습니다.");

//2. 클라이언트의 접속 기다리기..

System.out.println("클라이언트의 접속을 기다랍니다....");

Socket socket= serverSocket.accept();//여기서 커서(스레드)가 대기함.

System.out.println( socket.getInetAddress().getHostAddress()  + "클라이언트가 접속하셨습니다.");

//3. 데이터를 주고받을 Stream만들기!!

//데이터를 입력받은 스트림 만들기 : 해임달(Socket)에게 무지개로드(InputStream)을 열어주세요!!

//연결된 client소켓과 다리 연결!!

InputStream is= socket.getInputStream();//바이트 스트림

InputStreamReader isr= new InputStreamReader(is);//문자 스트림

BufferedReader reader= new BufferedReader(isr);//보조 문자 스트림

//클라이언트와 연결된 다리(Stream)을 통해 데이터를 읽어오기

String msg= reader.readLine();//클라이언트가 데이터를 보내면 한줄씩 일기...여기서 클라이언트가 데이터를 보낼때까지 대기....

System.out.println("받은 데이터 : " + msg);

reader.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} //0~65535

}

}




아래는 클라이언트 소스입니다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

import java.io.IOException;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.Socket;

import java.net.UnknownHostException;

import java.util.Scanner;


public class ClientTest {


public static void main(String[] args) {

// TODO Auto-generated method stub

//클라이언트는 서버의 IP주소, port번호를 알아야 접속할 수 있음.

String serverIP= " 접속할 서버 주소 ";

//serverIP= "127.0.0.1";//OK

//serverIP="localhost";//OK

//클라이언트의 작업

try {

//1. 서버와 연결하는 Socket생성(ip주소, 포트번호)

Socket socket= new Socket(serverIP, 10001);

System.out.println("서버와 연결이 되었습니다.");

//2. 데이터를 주고받을 Stream만들기!!

//데이터를 내보내는  Stream : 해임달(Socket)객체에게 무지개로드(Stream)을 열어달라고!!

OutputStream os= socket.getOutputStream();//바이트 스트림

//보조스트림을 이용하면 write()작업이 보다 수워함.

//OutputStreamWriter osw= new OutputStreamWriter(os);//문자스트림

PrintWriter writer= new PrintWriter(os); //보조 문자스트림

System.out.println("스트림 연결작업 성공!!..데이터전송 가능상태");

//보낼 데이터를 키보드로 입력받기

Scanner scanner= new Scanner(System.in);

System.out.print("보낼 메세지 입력 : ");

String msg= scanner.nextLine();

//스트림을 통해서 데이터 전송!

writer.println(msg);

writer.flush();

writer.close();

System.out.println("메세지 전송이 완료 되었습니다.");

} catch (UnknownHostException e) {

System.out.println("서버의 위치를 찾을 수 없음.");

} catch (IOException e) {

System.out.println("서버와 통신이 불가합니다.");

}

}

}


결과 테스트



서버와 연결하고 메시지를 보냅니다.


받은 메시지가 뜹니다.

반응형