Swing/Image Trans

Image Transmission with Socket

Soul-Learner 2014. 12. 29. 18:58

자바 소켓을 이용한 이미지 주고 받기


Client.java

package stream;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.*;

import javax.imageio.ImageIO;
import javax.swing.*;

public class Client extends JFrame {

	static Socket socket;
	static ImgPanel imgPanel;
	
	public static void main(String[] args) {
		
		new Client("네트워크에서 수신한 이미지 출력하기");
	}
	
	public Client(String title) {
		
		super(title);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLayout(null);
		this.setBounds(100, 100, 800, 600);
		imgPanel = new ImgPanel();
		imgPanel.setBounds(0, 0, 600, 400);
		this.getContentPane().add(imgPanel);
		this.setVisible(true);
		
		try {
			socket = new Socket("localhost", 1234);
		} catch (Exception e) {
			e.printStackTrace();
		}
		//서버로 이미지 전송
		sendImage("강성복.jpg");
		receiveImage();
	}
	
	// 서버측으로 이미지 데이터를 전송한다
	public void sendImage(String fname) {
		DataFormat df = new DataFormat(fname);
		ObjectOutputStream oos;
		try {
			oos = new ObjectOutputStream(socket.getOutputStream());
			oos.writeObject(df);
			oos.flush();
			System.out.println("서버로 이미지 전송완료");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	// 서버측에서 전송한 이미지 데이터를 BufferedImage 로 변환하여 화면에 출력한다
	public void receiveImage() {
		ObjectInputStream oin = null;
		try {
			oin = new ObjectInputStream(socket.getInputStream());
			DataFormat df = (DataFormat)oin.readObject();
			System.out.println(df.getFileName()+", "+df.getImgBuf().length);
			ByteArrayInputStream bin = new ByteArrayInputStream(df.getImgBuf());
			imgPanel.setImage( ImageIO.read(bin) );
			imgPanel.repaint();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

class ImgPanel extends JPanel {
	
	private BufferedImage image;
	
	public ImgPanel(){}
	
	public ImgPanel(BufferedImage image){
		this.image = image;
	}
	
	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawImage(image,0,0,null);
	}
	
	void setImage(BufferedImage image) {
		this.image = image;
	}
}


Server.java

package stream;

import java.io.*;
import java.net.*;

import javax.imageio.ImageIO;

public class Server {
	
	static Socket socket;
	
	public static void main(String[] args) {

		try {
			ServerSocket ss = new ServerSocket(1234);
			System.out.println("서버 대기중.......");
			
			socket = ss.accept();
			receiveImage();
			sendImage("강성복.jpg");

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//클라이언트가 보낸 이미지 데이터를 서버측 파일에 저장한다
	static void receiveImage() {
		ObjectInputStream oin = null;
		try {
			oin = new ObjectInputStream(socket.getInputStream());
			DataFormat df = (DataFormat)oin.readObject();
			System.out.println(df.getFileName()+", "+df.getImgBuf().length);

			FileOutputStream fout = new FileOutputStream("D:/test/upload/"+df.getFileName());
			fout.write(df.getImgBuf());
			fout.close();
			System.out.println("서버측에 이미지 저장완료");
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	//서버측에 저장된 이미지 파일을 클라이언트 측으로 전송한다
	static void sendImage(String fname) {
		DataFormat df = new DataFormat("D:/test/upload/", fname);
		ObjectOutputStream oos;
		try {
			oos = new ObjectOutputStream(socket.getOutputStream());
			oos.writeObject(df);
			oos.flush();
			System.out.println("클라이언트로 이미지 전송완료");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


DataFormat.java

package stream;

import java.io.*;

public class DataFormat implements Serializable{

	private String fileName;
	private byte[] imgBuf;

        // 클래스파일이 있는 곳에서 이미지를 로드할 때
	public DataFormat(String filename) {
		this.fileName = filename;
		InputStream ins = getClass().getResourceAsStream(filename);
		ByteArrayOutputStream bout = new ByteArrayOutputStream();
		byte[] buf = new byte[4096];
		int read = 0;
		try {
			while((read=ins.read(buf))!=-1){
				bout.write(buf, 0, read);
			}
			ins.close();
			imgBuf = bout.toByteArray();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
        // 프로젝트 밖에 있는 이미지 파일을 로드할 때
	public DataFormat(String path, String filename) {
		this.fileName = filename;
		InputStream ins = null; 
		ByteArrayOutputStream bout = new ByteArrayOutputStream();
		byte[] buf = new byte[4096];
		int read = 0;
		try {
			ins = new FileInputStream(path+filename);
			while((read=ins.read(buf))!=-1){
				bout.write(buf, 0, read);
			}
			ins.close();
			imgBuf = bout.toByteArray();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public String getFileName() {
		return fileName;
	}

	public void setFileName(String fileName) {
		this.fileName = fileName;
	}

	public byte[] getImgBuf() {
		return imgBuf;
	}

	public void setImgBuf(byte[] imgBuf) {
		this.imgBuf = imgBuf;
	}

}