출처 : 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번의 방법을 추천합니다.
'자바 > 자바팁' 카테고리의 다른 글
AD(ldap) 테스트용 Java 코드 (0) | 2011.11.02 |
---|---|
java socket 프로그래밍(헤더/본문포함) (0) | 2011.10.27 |
[펌]Socket을 이용한 서버로 파일 송수신 예제 입니다. (0) | 2011.10.20 |
[펌]Transfer a file via Socket (0) | 2011.10.20 |
[자바]소켓(CLient측) 연결 확인 (0) | 2011.10.20 |