Java SE/Socket File Request

File Request & Response in Java Socket

Soul-Learner 2014. 5. 23. 18:20

클라이언트 소켓으로부터 파일명을 수신한 서버가 해당 파일을 클라이언트에게 전송하는 예


JFrame의 JLabel 에 출력된 이미지를 파일에 저장하는 예제도 포함되어 있음(페이지 하단 참조)


Server.java

/*

 * To change this license header, choose License Headers in Project Properties.

 * To change this template file, choose Tools | Templates

 * and open the template in the editor.

 */


package org.kdea.filetransfer;


import java.io.*;

import java.net.*;

import java.util.logging.Level;

import java.util.logging.Logger;


/**

 *

 * @author duniv6-000

 */

public class Server 

{

    public static void main(String[] args) 

    {

        init();

    }

    

    private static void init()

    {

        ServerSocket ss = null;

        try {

            ss = new ServerSocket(1234);

        } catch (IOException ex) {

            ex.printStackTrace();

            //Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);

        }

        while(true) 

        {

            System.out.println("서버 대기중....");

            try {

                Socket socket = ss.accept();

                System.out.println("클라이언트 접속");


                // 텍스트 데이터를 수신하여 파일명을 확인한다

                InputStream is = socket.getInputStream();

                BufferedReader br = new BufferedReader(new InputStreamReader(is));

                String line = br.readLine();

                String fn = null;

                if(line.indexOf("IMG_REQ:")!=-1)

                {

                    fn = line.split(":")[1];

                }


                // 클라이언트가 요청한 파일을 전송해준다

                new ImgTransThread(socket, fn).start();

                

            }catch(Exception ex) {

                System.out.println("클라이언트 퇴장");

                //ex.printStackTrace();

            }

        }

    }

}



ImgTransThread.java

class ImgTransThread extends Thread

{

    Socket socket;

    String fileName;

    

    ImgTransThread(Socket socket, String fileName)

    {

        this.socket = socket;

        this.fileName = fileName;

    }

    

    @Override

    public void run() 

    {

        // 클라이언트가 요청한 파일을 전송해준다

        try {

            OutputStream os = socket.getOutputStream();

            FileInputStream fin = new FileInputStream("d:/test/"+fileName+".jpg");

            byte[] buf = new byte[1024];

            int read = 0;

            while((read=fin.read(buf, 0, buf.length))!=-1)

            {

                os.write(buf, 0, read);

            }

            fin.close();

            os.close(); // 스트림을 닫아야만 클라이언트 측에서 파일 수신을 종료할 수 있다

            

            System.out.println("파일 전송완료");

        }catch(IOException ex) {

            System.out.println("클라이언트 퇴장");

            //ex.printStackTrace();

        }

    }

}



Client.java

/*

 * To change this license header, choose License Headers in Project Properties.

 * To change this template file, choose Tools | Templates

 * and open the template in the editor.

 */


package org.kdea.filetransfer;


import java.awt.image.BufferedImage;

import java.net.*;

import java.io.*;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.imageio.ImageIO;

import javax.swing.ImageIcon;


/**

 *

 * @author duniv6-000

 */

public class Client 

{

    public static void init()

    {

        Socket socket = null;

        try {

            socket = new Socket("localhost", 1234);

            InputStream is = socket.getInputStream();

            BufferedImage bi = ImageIO.read(is);

            ImageIcon icon = new ImageIcon(bi);

            ClientFrame.mFrame.displayImage(icon);

            System.out.println("수신된 이미지를 화면에 출력함");

        } catch (Exception ex) {

            ex.printStackTrace();

            //Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);

        }

    }


     // JFrame 클래스에서 이 메소드를 호출할 때 파일명을 전달한다

    static void getImage(String name)

    {

        Socket socket = null;

        try {

            socket = new Socket("localhost", 1234);

            

            // 이미지 파일명을 서버로 전달

            OutputStream os = socket.getOutputStream();

            PrintWriter pw = new PrintWriter(new OutputStreamWriter(os));

            pw.println("IMG_REQ:"+name);

            pw.flush();

            

            new ImgReceiverThread(socket).start(); // 이미지 데이터를 수신하는 쓰레드 실행

            

        } catch (Exception ex) {

            ex.printStackTrace();

            //Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);

        }

    }

     

}



ImgReceiverThread.java

class ImgReceiverThread extends Thread

{

    Socket socket;

    

    ImgReceiverThread(Socket socket)

    {

        this.socket = socket;

    }


    @Override

    public void run() 

    {

        try {

            // 서버로부터 이미지 수신 및 화면에 이미지 출력

            InputStream is = socket.getInputStream();

            BufferedImage bi = ImageIO.read(is);

            ImageIcon icon = new ImageIcon(bi);


            // JFrame 클래스의 콜백 메소드를 호출하여 JFrame 화면에 이미지를 출력한다

            ClientFrame.mFrame.displayImage(icon); 

            

            System.out.println("수신된 이미지를 화면에 출력함");

            socket.close();

        } catch (IOException ex) {

            ex.printStackTrace();

            //Logger.getLogger(ImgReceiverThread.class.getName()).log(Level.SEVERE, null, ex);

        }

    }

}



JFrame 화면의 JLabel 에 출력된 이미지를 파일에 저장하는 예

    // JLabel에 출력된 이미지를 파일에 저장

    private void jMenuItem5ActionPerformed(java.awt.event.ActionEvent evt) {                                           

        ImageIcon icon = (ImageIcon)labelImg.getIcon();

        BufferedImage bi = (BufferedImage)icon.getImage();

        File outputfile = new File("d:/test/saved.png");

        try {

            ImageIO.write(bi, "png", outputfile);

            System.out.println("파일저장 성공");

        }catch(Exception ex) {

            ex.printStackTrace();

        }

    }