티스토리 뷰

안녕하세요 박스여우입니다.

이번에는 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을 통해 이미지 뿌리기  (0) 2015.07.23
Java - 폴더 복사  (0) 2015.07.15
Java - File 이어쓰기  (0) 2015.07.13
java - JTextArea에 이미지 뿌리기  (0) 2015.07.10
Java - TCP/IP Socket  (0) 2015.07.10
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함