출처 : http://endroid.tistory.com/entry/JAVASocket-Image-%EC%A0%84%EC%86%A1
 

두 가지의 경우가 있겠죠..

 

1. 서버가 java이고 클라이언트는 다른 언어인 경우.

2. 서버와 클라이언트 모두 java로 구현하는 경우.

 

각각 다른 방식으로 프로그래밍을 할 수 있습니다.

1의 경우가 좀더 범용적이겠죠..

 

두 가지를 모두 말씀드리겠습니다.

 

- 1번의 경우...

  일반적으로 통신은 byte 단위로 이루어집니다.

  따라서 file을 읽으면 Image 클래스로 읽지 마시고, FileInputStream으로 읽으셔서

  byte 단위로 전송하는 방법입니다. 전송할 파일의 크기를 클라이언트쪽에서 알 수 없으므로,

  먼저 파일의 크기를 전송하고, 파일의 내용을 보내게 됩니다.

  클라이언트도 byte 단위로 받게 되므로 받는것을 그대로 FileOutputStream으로 쓰게 되면

  원본 이미지가 그대로 저장되게 됩니다.

 

  * sample code -- server side

  ServerSocket ssock = new ServerSocket(<server port>);

  Socket csock = NULL;

  byte buffer[] = new byte[2048];

  ...

  File imgfile = new File(<image file>);

  String flen = String.valueOf(imgfile.length());

  // change "1234" to "0000001234", to make sure 10 size.

  String header = "0000000000".substring(0, 10-flen.length()) + flen;

  while ((csock = ssock.accept()) != NULL) {

    FileInputStream fis = new FileInputStream(imgfile);

    OutputStream os = csock.getOutputStream();

    // send header

    os.write(header.getBytes());

    // send body

    while (fis.available() > 0) {

      int readsz = fis.read(buffer);

      os.write(buffer, 0, readsz);

    }

    os.close();

    fis.close();

  }

  ...

 

  * sample code -- client side

  Socket sock = new Socket(<server address>, <server port>);

  ...

  FileOutputStream fos = new FileOutputStream(<image file to be saved>);

  InputStream is = sock.getInputStream();

  byte buffer[] = new byte[2048];

  // read header(10 bytes)

  is.read(buffer, 0, 10);

  String header = new String(buffer, 0, 10);

  int bodysize = Integer.parseInt(header);

  int readsize = 0;

  // read body

  while (readsize < bodysize) {

    int rsize = is.read(buffer);

    fos.write(buffer, 0, rsize);

    readsize += rsize;

  }

  is.close();

  fos.close();

 

 

2. 서버와 클라이언트 양쪽이 모두 java인 경우

  아주 심플합니다. java 자체에서 객체전송을 허용하기 때문에

  ObjectInputStream과, ObjectOutputStream을 사용하면 됩니다.

 

  * sample code -- server side

  Image img = ImageIO.read(new File(<image file>));

  ServerSocket ssock = new ServerSocket(<server port>);

  Socket csock = NULL;

  ...

  while ((csock = ssock.accept()) != NULL) {

    ObjectOutputStream oos = new ObjectOutputStream(csock.getOutputStream());
    // send image

    oos.writeObject(img);

    oos.close();

    csock.close();

  }

  ...

 

  * sample code -- client side

  Socket sock = new Socket(<server address>, <server port>);

  ...

  ObjectInputStream ois = new ObjectInputStream(sock.getInputStream())

  Image img = (Image)ois.readObject();

  ois.close();

  sock.close();

  ...

 

이 외에도 ImageIO에서 제공하는 형태의 ImageInputStream, ImageOutputStream 등등도 있지만,

위의 두 형태가 가장 많이 사용됩니다.

 

범용적으로 쓰시려면 1번의 방법을 추천합니다.

+ Recent posts