본문 바로가기

Java SE/Socket Object Stream

Java Socket Object Stream example

자바 소켓을 이용하여 텍스트와 이미지를 동시에 전송하는 예

ObjectInputStream, ObjectOutputStream 을 이용하면 텍스트와 Image를 한개의 클래스 인스턴스에 포함시켜서 매우 쉽게 서버로 전송할 수 있다


Client.java

import java.io.*;

import java.net.*;


import javax.swing.ImageIcon;



public class Client {

    

    public static void main(String[] args) {

        

        Socket socket = null;

        try {

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

            

            // 연속적으로 2개의 이미지를 서버로 전송한다

            ImageIcon img = new ImageIcon("d:/test/sample1.jpg");

            DataFormat df = new DataFormat("sample1.jpg", img);

            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

            oos.writeObject(df);

            oos.flush();

            

            // 2번째 이미지 전송

            ImageIcon img2 = new ImageIcon("d:/test/sample2.jpg");

            DataFormat df2 = new DataFormat("sample2.jpg", img2);

            ObjectOutputStream oos2 = new ObjectOutputStream(socket.getOutputStream());

            oos2.writeObject(df2);

            oos2.flush();

            

            System.out.println("서버로 전송완료");

        } catch (IOException ex) {

            ex.printStackTrace();

        }

    }

}


class DataFormat implements Serializable {

    

    private String fileName;

    private ImageIcon img;

    

    public DataFormat(String fileName, ImageIcon img) {

        this.fileName = fileName;

        this.img = img;

    }


    public void setFileName(String fileName) {

        this.fileName = fileName;

    }


    public void setImg(ImageIcon img) {

        this.img = img;

    }


    public String getFileName() {

        return fileName;

    }


    public ImageIcon getImg() {

        return img;

    }


}



Server.java

import java.awt.Graphics2D;

import java.awt.Image;

import java.awt.image.BufferedImage;

import java.io.*;

import java.net.*;

import javax.imageio.ImageIO;

import javax.swing.ImageIcon;


public class Server {


    static ServerSocket ss;


    public static void main(String[] args) {

        try {

            ss = new ServerSocket(1234);

            while(true) {

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

                Socket socket = ss.accept();

                ServerThread svrThread = new ServerThread(socket);

                svrThread.start();

            }

        } catch (Exception ex) {

            ex.printStackTrace();

        }

    }

}


class ServerThread extends Thread {

    

    Socket socket;


    ServerThread(Socket socket) {

        this.socket = socket;

    }


    @Override

    public void run() {

        ObjectInputStream ois = null;

        try {

            while(true) { // 클라이언트가 연결을 종료할 때까지 데이터를 수신한다

                ois = new ObjectInputStream(socket.getInputStream());

                DataFormat df = (DataFormat) ois.readObject();

                String fileName = df.getFileName();

                ImageIcon icon = df.getImg();

                Image img = icon.getImage();

                BufferedImage bimg = new BufferedImage(img.getWidth(null),img.getHeight(null),BufferedImage.TYPE_INT_RGB);

                Graphics2D g2 = bimg.createGraphics();

                g2.drawImage(img, 0, 0, null);

                g2.dispose();

                ImageIO.write(bimg, "jpg", new File("d:/test/cpy/"+fileName));

                System.out.println("서버에서 수신완료"+fileName);

            }

        } catch (Exception ex) {

            //ex.printStackTrace();

            System.out.println("클라이언트 나감");

        } finally {

            try {

                ois.close();

            } catch (IOException ex) {

                ex.printStackTrace();

            }

        }

        System.out.println("서버에서 수신쓰레드 종료");

    }

}