티스토리 뷰
안녕하세요 박스여우입니다.
이번에는 Java의 Socket를 이용해서 파일을 전송하여 복사하는방법에대해 알아보겠습니다.
※주의※
이 글의 예제는 입문 수준의 코드이므로 모범적이지 못한 예제입니다.
단순히 파일을 읽고 소켓통신을 하는 방법에 대해서만 참고하는 목적으로 읽어주시길 바랍니다!
Client
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 |
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class test{
public static void main(String[] args){
OutputStream out;
FileInputStream fin;
try{
Socket soc = new Socket("127.0.0.1",11111); //127.0.0.1은 루프백 아이피로 자신의 아이피를 반환해주고,
System.out.println("Server Start!"); //11111은 서버접속 포트입니다.
out =soc.getOutputStream(); //서버에 바이트단위로 데이터를 보내는 스트림을 개통합니다.
DataOutputStream dout = new DataOutputStream(out); //OutputStream을 이용해 데이터 단위로 보내는 스트림을 개통합니다.
Scanner s = new Scanner(System.in); //파일 이름을 입력받기위해 스캐너를 생성합니다.
while(true){
String filename = s.next(); //스캐너를 통해 파일의 이름을 입력받고,
fin = new FileInputStream(new File(filename)); //FileInputStream - 파일에서 입력받는 스트림을 개통합니다.
byte[] buffer = new byte[1024]; //바이트단위로 임시저장하는 버퍼를 생성합니다.
int len; //전송할 데이터의 길이를 측정하는 변수입니다.
int data=0; //전송횟수, 용량을 측정하는 변수입니다.
while((len = fin.read(buffer))>0){ //FileInputStream을 통해 파일에서 입력받은 데이터를 버퍼에 임시저장하고 그 길이를 측정합니다.
data++; //데이터의 양을 측정합니다.
}
int datas = data; //아래 for문을 통해 data가 0이되기때문에 임시저장한다.
fin.close();
fin = new FileInputStream(filename); //FileInputStream이 만료되었으니 새롭게 개통합니다.
dout.writeInt(data); //데이터 전송횟수를 서버에 전송하고,
dout.writeUTF(filename); //파일의 이름을 서버에 전송합니다.
len = 0;
for(;data>0;data--){ //데이터를 읽어올 횟수만큼 FileInputStream에서 파일의 내용을 읽어옵니다.
len = fin.read(buffer); //FileInputStream을 통해 파일에서 입력받은 데이터를 버퍼에 임시저장하고 그 길이를 측정합니다.
out.write(buffer,0,len); //서버에게 파일의 정보(1kbyte만큼보내고, 그 길이를 보냅니다.
}
System.out.println("약 "+datas+" kbyte");
}
}catch(Exception e){
}
}
} |
cs |
Server
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 |
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class filetest {
static Socket client = new Socket();
public static void main(String[] args) throws Exception{
ServerSocket soc = new ServerSocket(11111); //포트 11111로 서버를 개통합니다.
System.out.println("Server Start");
client = soc.accept(); //클라이언트의 접속을 받습니다.
System.out.println("client accept!");
InputStream in = null;
FileOutputStream out = null;
in = client.getInputStream(); //클라이언트로 부터 바이트 단위로 입력을 받는 InputStream을 얻어와 개통합니다.
DataInputStream din = new DataInputStream(in); //InputStream을 이용해 데이터 단위로 입력을 받는 DataInputStream을 개통합니다.
while(true){
int data = din.readInt(); //Int형 데이터를 전송받습니다.
String filename = din.readUTF(); //String형 데이터를 전송받아 filename(파일의 이름으로 쓰일)에 저장합니다.
File file = new File(filename); //입력받은 File의 이름으로 복사하여 생성합니다.
out = new FileOutputStream(file); //생성한 파일을 클라이언트로부터 전송받아 완성시키는 FileOutputStream을 개통합니다.
int datas = data; //전송횟수, 용량을 측정하는 변수입니다.
byte[] buffer = new byte[1024]; //바이트단위로 임시저장하는 버퍼를 생성합니다.
int len; //전송할 데이터의 길이를 측정하는 변수입니다.
for(;data>0;data--){ //전송받은 data의 횟수만큼 전송받아서 FileOutputStream을 이용하여 File을 완성시킵니다.
len = in.read(buffer);
out.write(buffer,0,len);
}
System.out.println("약: "+datas+" kbps");
out.flush();
out.close();
}
}
}
|
cs |
'프로그래밍 > java' 카테고리의 다른 글
Java - 화면 중앙에 띄우기, URL을 통해 이미지 뿌리기 (421) | 2015.07.23 |
---|---|
Java - 폴더 복사 (0) | 2015.07.15 |
Java - File 이어쓰기 (389) | 2015.07.13 |
java - JTextArea에 이미지 뿌리기 (0) | 2015.07.10 |
Java - TCP/IP Socket (0) | 2015.07.10 |
댓글