콘솔을 통해 파일조회 및 파일다운로드 기능

ls : 파일리스토 조회
GET 파일명 : 해당파일 다운로드

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
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
 
public class FileDownClient {
    private final static  String IP = "127.0.0.1";
    private final static  int    PORT = 12345;
    
    FileDownClientReciever fileRecv;
    public FileDownClient() {
        try {            
            fileRecv = new FileDownClientReciever(new Socket(IP, PORT));
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    public void getFile(String fileName) {
        fileRecv.getFile(fileName);
    }
    
    public void getFileList(String cmd) {
        fileRecv.getFileList(cmd);        
    }
    
}
 
cs

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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class FileDownClientConsol implements Runnable{
    private final String LS = "ls";
    private final String GET = "GET";
    FileDownClient fileClient;
    
    public FileDownClientConsol() {
        fileClient = new FileDownClient();
    }
    
//    FileDownClient fileClient = new FileDownClient();
//    
    
    @Override
    public void run() {
        // TODO Auto-generated method stub
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String readLine;
        try {
            while((readLine = br.readLine()) != null) {
                if(LS.equalsIgnoreCase(readLine)) {
                    fileClient.getFileList(readLine);
                }else if(readLine.toUpperCase().startsWith(GET)){
                    System.out.println(readLine);
                    String[] args = readLine.split(" ");
                    getFile(args[1].trim());
                }
                
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    private void getFile(String name) {
        fileClient.getFile(name);        
    }
 
}
 
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class FileDownClientLauncher {
    
    public static void main(String[] args) {
        
        FileDownClientConsol fileClientConsol = new FileDownClientConsol();
        
        ExecutorService exeService = Executors.newSingleThreadExecutor();
        exeService.execute(fileClientConsol);
        
    }
}
 
cs

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
 
public class FileDownClientReciever {
    private static final String END = "#END#";
    private static final int BUF_SIZE = 1024 * 1024;
    private static final int HEADER_SIZE = 74;
    Socket socket;
    BufferedWriter bw;
    BufferedReader br;
    BufferedInputStream bis;
    
    public FileDownClientReciever(Socket socket) {
        this.socket = socket;
        try {
            bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            bis = new BufferedInputStream(socket.getInputStream());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }        
    }
    
    public void getFileList(String cmd) {
        try {
            
            bw.write(cmd);
            bw.newLine();
            bw.flush();
             
            String readLine;
            while((readLine = br.readLine()) != null) {
                if(END.equals(readLine)) {
                    System.out.println("End of read");
                    break;
                }
                System.out.println(readLine);
            }
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    public void getFile(String fileName) {
        
        File dir = new File("./DOWNFILE");
        
        if(!dir.exists()) dir.mkdir();
                
        try {
            
            //BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            
            bw.write(fileName);
            bw.newLine();
            bw.flush();
            //bw.close();
            
            byte[] header = new byte[HEADER_SIZE];
            byte[] buffer = new byte[BUF_SIZE];
            
            int readLen;
            readLen = bis.read(header, 0, HEADER_SIZE);
 
            if(readLen == -1return;
            
            byte[] bfileName = new byte[64];
            byte[] bfileLen  = new byte[10];
            
            System.out.println(new String(header));
            
            System.out.println("bfileName.length : " + bfileName.length);
            System.out.println("bfileLen.length  : " + bfileLen.length);
            
            System.arraycopy(header, 0, bfileName, 0, bfileName.length);
            System.arraycopy(header, bfileName.length, bfileLen, 0, bfileLen.length);
            
            String strFileName = (new String(bfileName)).trim();
            //String strFileName = new String(bfileName);
            
            /* 문자열 길이가 0이면 끝 */
            if( strFileName.length() == 0return;
            
            File file = new File("./DOWNFILE/" + strFileName);
            
            System.out.println("[" + file.getAbsolutePath() + "]");
            
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
            
            int fileLen = Integer.parseInt(new String(bfileLen));
            
            while(fileLen > 0) {
                readLen = bis.read(buffer, 0, Math.min(fileLen, BUF_SIZE));
                if(readLen != -1) {
                    bos.write(buffer, 0, readLen);
                }
                fileLen -= readLen;
            }
            bos.flush();
            bos.close();
            //bis.close();
            //bw.close();            
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    
}
 
cs

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
 
public class FileDownServer implements Runnable {
    private static final int BUF_SIZE = 1024 * 1024/* 1M */
    private static final int HEADER_SIZE = 74;
    Socket socket;
    @Override
    public void run() {
 
        while(true) {
            String fileName = readRequstFile();        
 
            File targetFile = searchFile(fileName);
 
            //System.out.println("File target file : " + targetFile.getAbsolutePath());
 
            sendFile(targetFile);
 
        }
 
        //System.out.println("End of Server.");
 
    }
 
    public FileDownServer(Socket socket) {
        this.socket = socket;
    }
 
    public String readRequstFile() {
 
        String requestFileName = null;
 
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while((requestFileName = br.readLine()) != null) {
                if(requestFileName.equalsIgnoreCase("LS")) {
                    sendFileList();
                }else {
                    System.out.println("requestFileName : [" + requestFileName + "]");
                    return requestFileName;
                }
            }
 
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }        
        return requestFileName;        
    }
    
    public void sendFileList() {
        File dir = new File("./FILESERVER");
        
        if(!dir.exists()) return;
        
        String[] fileNames = dir.list();
        
        try {
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            for(String fileName : fileNames) {
                bw.write(fileName);
                bw.newLine();
            }
            bw.write("#END#");
            bw.newLine();
            bw.flush();
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
    }
 
    public File searchFile(String fileName) {
        File dir = new File("./FILESERVER");
 
        if(!dir.exists()) return null;
 
        File[] files = dir.listFiles();
 
        for(File file : files) {
            if(file.getName().equals(fileName)) {
                return file;
            }        
        }
        return null;
    }
 
    public void sendFile(File file) {
        /* File Send 한글처리하기가 힘들다... */
        /* File Header 
         * FileName : 64
         * FileLen  : 10
         */
        
        byte[] buffer = new byte[BUF_SIZE];
        
        if(file == null) {
            
            byte[] fileName = new byte[64];
            byte[] fileLen  = String.format("%010d"0).getBytes();
            
            System.arraycopy(fileName, 0, buffer, 0, fileName.length);
            System.arraycopy(fileLen,  0, buffer, 64, fileLen.length);
            System.out.println(fileName +" : " + fileLen);
            System.out.println("BufferHeader : [" + new String(buffer) + "]");
            
            BufferedOutputStream bos;
            try {
                bos = new BufferedOutputStream(socket.getOutputStream());
                bos.write(buffer, 0, HEADER_SIZE);
                bos.flush();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return;
        }
        
        
        byte[] fileName = file.getName().getBytes();
 
        try {
 
            byte[] fileLen  = String.format("%010d", file.length()).getBytes();
 
            System.out.println("[" + new String(fileLen) + "]");
            
            System.arraycopy(fileName, 0, buffer, 0, fileName.length);
            System.arraycopy(fileLen,  0, buffer, 64, fileLen.length);
            System.out.println(fileName +" : " + fileLen);
            System.out.println("BufferHeader : [" + new String(buffer) + "]");
            
            BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
 
            bos.write(buffer, 0, HEADER_SIZE);
            bos.flush();
 
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
 
            int reaLen;
            while((reaLen = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, reaLen);
            }
            bos.flush();
            //bis.close();
            //bos.close();
            
        }catch(Exception e) {
            e.printStackTrace();
        }
 
    }
 
}
 
cs

1
2
3
4
5
6
7
8
 
public class FileDownServerLauncher {
    public static void main(String[] args) {
        FileDownServerListener fileListener = new FileDownServerListener();
        fileListener.listenClient();
    }
}
 
cs

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
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class FileDownServerListener {
    private static final int PORT = 12345;
    ServerSocket server;
    ExecutorService exeService;
    
    public FileDownServerListener() {
        try {
            this.server = new ServerSocket(PORT);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        exeService = Executors.newFixedThreadPool(10);
    }
    
    public void listenClient() {
        
        while(true) {
            try {
                
                Socket socket = server.accept();
                
                FileDownServer fileDownServer = new FileDownServer(socket);
                
                exeService.execute(fileDownServer);                
                
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
                        
        }
        
    }
    
}
 
cs


+ Recent posts