자바 소켓을 이용한 이미지 주고 받기
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; } }