yoni

[33][Network] 서버로 전송된 현재 온도를 파일로 저장하고 읽어오는 네트워크 프로그램 제작 본문

java of educational by contents

[33][Network] 서버로 전송된 현재 온도를 파일로 저장하고 읽어오는 네트워크 프로그램 제작

yoni-1117 2018. 12. 15. 13:22
1. Server
   - 수집되는 온도를 파일로 출력하는 프로그램을 제작하세요.
   - 수집되는 온도의 범위는 -5도 ~ 5도
   - 온도 수집은 3초에 한번씩 전송 되도록 합니다. Thread 이용
     Thread.sleep(3000); // 3초간 실행 중지 

   - bw.write(String.valueOf(temp)): 전송시 문자열로 변경하여 전송합니다.
   - bw.newLine(): Enter를 전송하여 readLine() 메소드를 작동하게합니다.

[실행 화면]

접속자를 기다리는 중입니다.
[접속 IP] 172.16.7.250
-4
-1
-1
0
0
1
-2
2
-5
데이터 수집을 종료합니다.
새로운 위치에서 데이터를 수신 준비합니다.


▷ network.CollectServer.java
java network.CollectServer 
-----------------------------------------------------------------------------------
package network;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.StringTokenizer;
 
public class CollectServer {
 
  public static void main(String[] args) {
    ServerSocket server = null; // client의 접속 요청을 처리
 
    Socket socket = null;         // 데이터 송수신
    InetAddress inet = null;     // 접속 정보
    
    InputStream is = null;       // 네트워크 수신
    InputStreamReader isr = null; // 수신된 코드를 한글로 변환
    BufferedReader br = null;      // 메모리에 기록
    
    try {
      server = new ServerSocket(2010); // 2010
      
      while(true) { // 무한 루틴
        System.out.println("접속자를 기다리는 중입니다.");
        socket = server.accept(); // 대기중
        inet = socket.getInetAddress();
        System.out.println("접속된 Client IP: " + inet.getHostAddress());
        
        br = new BufferedReader(new InputStreamReader(   .....   ));
        while(true) {
          String line =     .....     ;
          if (line == null) {
            System.out.println("온도 수집을 종료합니다.");
            System.out.println();
            break;
          } else {
            System.out.println(line); // 수집된 온도를 출력
          }
        }
        
      }
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        br.close();
      } catch(Exception e) {
      }
      
      try {
        socket.close();
      } catch(Exception e) {
      }   
  
      try {
        server.close();
      } catch(Exception e) {
      }   
    }
 
  }
 
}
 -> 답
package network;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.StringTokenizer;
 
public class CollectServer {
 
  public static void main(String[] args) {
    ServerSocket server = null; // client의 접속 요청을 처리
 
    Socket socket = null;         // 데이터 송수신
    InetAddress inet = null;     // 접속 정보
    
    InputStream is = null;       // 네트워크 수신
    InputStreamReader isr = null; // 수신된 코드를 한글로 변환
    BufferedReader br = null;      // 메모리에 기록
    
    try {
      server = new ServerSocket(2010); // 2010
      
        while(true) {// 무한루틴: 다른 사용자가 들어오게 된다면 막을수가 없다 쓰레드를 사용하지 않았을때 전형적인 문제점이다 클라이언트가 서버를 점유하게 되는 전형적인 버그가 생긴다
        System.out.println("접속자를 기다리는 중입니다.");
        socket = server.accept(); // 대기중
        inet = socket.getInetAddress();
        System.out.println("접속된 Client IP: " + inet.getHostAddress());
        
        br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        while(true) {
          String line = br.readLine();
          if (line == null) {
            System.out.println("온도 수집을 종료합니다.");
            System.out.println();
            break;
          } else {
            System.out.println(line); // 수집된 온도를 출력
          }
        }
        
      }
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        br.close();
      } catch(Exception e) {
      }
      
      try {
        socket.close();
      } catch(Exception e) {
      }   
  
      try {
        server.close();
      } catch(Exception e) {
      }   
    }
 
  }
 
}
 
  
  
-----------------------------------------------------------------------------------
 

 
2. Client
   - 영하 5도이면 수집을 종료합니다.
 
▷ network.CollectClient.java
java network.CollectClient 127.0.0.1 2010
-----------------------------------------------------------------------------------
package network;
 
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Random;
 
public class CollectClient {
 
  public static void main(String[] args) {
    Socket socket = null;         // 데이터 송수신
    InetAddress inet = null;     // 접속 정보
    
    OutputStream os = null;  // 네트워크 전송
    OutputStreamWriter osw = null; // 출력시 한글을 코드로 변환 처리
    BufferedWriter bw = null;    // 출력할 데이터를 메모리에 저장
 
    try {
      socket = new Socket(args[0], Integer.parseInt(args[1])); // 서버에 연결 요청, ip, port
      inet = socket.getInetAddress();
      System.out.println("접속된 Server IP: " + inet.getHostAddress());
      
      bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
      
      while(true) {
        Thread.sleep(3000);
        Random rnd =     .....     ;
        int temp = rnd.nextInt(11) - 5; // 0 ~ 10 -> -5 ~ 5 
        System.out.println("온도: " + temp);
        
        bw.write(String.valueOf(temp)); // int -> String
        bw.newLine();  // 2개 이상의 문장 전송
        bw.flush(); // 네트워크로 전송
        
        if (temp == -5) {
          System.out.println("데이터 수집을 종료합니다.");
          break;
        }
        
      }
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally {
      try {
        bw.close();
      } catch(Exception e) {
      }
      
      try {
        socket.close();
      } catch(Exception e) {
      } 
    }
    
 
  }
 
}
 
 
 ->답
package network;
 
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Random;
 
public class CollectClient {
 
  public static void main(String[] args) {
    Socket socket = null;         // 데이터 송수신
    InetAddress inet = null;     // 접속 정보
    
    BufferedWriter bw = null;    // 출력할 데이터를 메모리에 저장
 
    try {
      socket = new Socket(args[0], Integer.parseInt(args[1])); // 서버에 연결 요청, ip, port
      inet = socket.getInetAddress();
      System.out.println("접속된 Server IP: " + inet.getHostAddress());
      
      bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
      
      while(true) {
        Thread.sleep(3000);
        Random rnd = new Random();
        int temp = rnd.nextInt(11) - 5; // 0 ~ 10 -> -5 ~ 5 
        System.out.println("온도: " + temp);
        
        bw.write(String.valueOf(temp)); // int -> String
        bw.newLine();  // 2개 이상의 문장 전송
        bw.flush(); // 네트워크로 전송
        
        if (temp == -5) {
          System.out.println("데이터 수집을 종료합니다.");
          break;
        }
        
      }
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally {
      try {
        bw.close();
      } catch(Exception e) {
      }
      
      try {
        socket.close();
      } catch(Exception e) {
      } 
    }
    
 
  }
 
}
-----------------------------------------------------------------------------------

 

 

[02] 서버로 전송된 현재 온도를 파일로 저장하고 읽어오는 네트워크 프로그램 제작

1) 파일 쓰기 과정
    - String fileName -> FileWriter -> PrintWriter -> pw.println("") -> pw.flush(); 
    - pw.print(""): 파일 기록후 라인 변경 안함. 
    - pw.println(""): 파일 기록후 라인 변경함. 
    - java.io.FileNotFoundException: 폴더나 파일이 없거나 틀린 경우 

2) FileWriter(파일명, 추가 여부) 클래스의 옵션
    - 파일이 없으면 파일을 자동으로 생성합니다. 폴더는 생성하지 않습니다.
    - false: 기존 내용을 전부 삭제 후 새로운 내용으로 변경합니다.
    - true: 기존 내용에 새로운 내용을 이어서 뒤쪽에 추가합니다.    



1. Server
   - 수집되는 온도를 파일로 출력하는 프로그램을 제작하세요.
   - 수집되는 온도의 범위는 -5도 ~ 5도
   - 온도 수집은 3초에 한번씩 전송 되도록 합니다. Thread 이용
     Thread.sleep(3000); // 3초간 실행 중지 

   - bw.write(String.valueOf(temp)): 전송시 문자열로 변경하여 전송합니다.
   - bw.newLine(): Enter를 전송하여 readLine() 메소드를 작동하게합니다.

[실행 화면]

접속자를 기다리는 중입니다.
[접속 IP] 172.16.7.250
-4
-1
-1
0
0
1
-2
2
-5
데이터 수집을 종료합니다.
새로운 위치에서 데이터를 수신 준비합니다.

(위와 다르게 데이터를 file로 저장함)
▷ network.CollectServer2.java
java network.CollectServer2 
-----------------------------------------------------------------------------------
package network;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.StringTokenizer;
 
public class CollectServer2 {
 
  public static void main(String[] args) {
    ServerSocket server = null; // client의 접속 요청을 처리
 
    Socket socket = null;         // 데이터 송수신
    InetAddress inet = null;     // 접속 정보
    
    InputStream is = null;       // 네트워크 수신
    InputStreamReader isr = null; // 수신된 코드를 한글로 변환
    BufferedReader br = null;      // 메모리에 기록
    
    File file = null; // 온도 저장 파일
    // PrintWriter -> FileWriter -> File
    FileWriter writer = null;    // 파일에 기록
    PrintWriter pw = null;      // 메모리에 기록
    
    try {
      file = new File("C:/ai3/io/temperature.txt");
 
      server = new ServerSocket(2010); // 2010
      
      while(true) { // 무한 루틴
        System.out.println("접속자를 기다리는 중입니다.");
        socket = server.accept(); // 대기중
        inet = socket.getInetAddress();
        System.out.println("접속된 Client IP: " + inet.getHostAddress());
        
        br = new BufferedReader(new InputStreamReader(   .....   ));
 
        // false: 기존 내용을 지우고 기록, true: 파일 하단에 추가
        writer = new FileWriter(file, true); // 파일이 추가  
        pw = new PrintWriter(writer);
        
        pw.println("----------------------------------------------");
        pw.println("현재 온도 수신 센서 위치: " + inet.getHostAddress());
        pw.println("수집 시작 시간: " + new Date().toLocaleString());
        pw.println("----------------------------------------------");
        
        while(true) {
          String line =     .....     ;
          if (line == null) {
            System.out.println("온도 수집을 종료합니다.");
            System.out.println();
            break;
          } else {
            System.out.println(line); // 수집된 온도를 출력
                .....                  // 파일에 기록
          }
        }
        
        pw.println("----------------------------------------------");
        pw.println("수집 종료 시간: " + new Date().toLocaleString());
        pw.println("----------------------------------------------");
        pw.println();
        
        try {
          pw.close();
        } catch(Exception e) {
        }
        try {
          writer.close();
        } catch(Exception e) {
        }
        try {
          br.close();
        } catch(Exception e) {
        }      
        try {
          socket.close();
        } catch(Exception e) {
        }   
 
      }
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
 
      try {
        server.close();
      } catch(Exception e) {
      }  
    }
  }
 
}
 
 ->답
package network;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.StringTokenizer;
 
public class CollectServer2 {
 
  public static void main(String[] args) {
    ServerSocket server = null; // client의 접속 요청을 처리
 
    Socket socket = null;         // 데이터 송수신
    InetAddress inet = null;     // 접속 정보
    
    InputStream is = null;       // 네트워크 수신
    InputStreamReader isr = null; // 수신된 코드를 한글로 변환
    BufferedReader br = null;      // 메모리에 기록
    
    File file = null; // 온도 저장 파일
    // PrintWriter -> FileWriter -> File
    FileWriter writer = null;    // 파일에 기록
    PrintWriter pw = null;      // 메모리에 기록
    
    try {
      file = new File("C:/ai3/io/temperature.txt");
 
      server = new ServerSocket(2010); // 2010
      
      while(true) { // 무한 루틴
        System.out.println("접속자를 기다리는 중입니다.");
        socket = server.accept(); // 대기중
        inet = socket.getInetAddress();
        System.out.println("접속된 Client IP: " + inet.getHostAddress());
        
        br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
 
        // false: 기존 내용을 지우고 기록, true: 파일 하단에 추가
        writer = new FileWriter(file, true); // 파일이 추가  
        pw = new PrintWriter(writer);
        
        pw.println("----------------------------------------------");
        pw.println("현재 온도 수신 센서 위치: " + inet.getHostAddress());
        pw.println("수집 시작 시간: " + new Date().toLocaleString());
        pw.println("----------------------------------------------");
        
        while(true) {
          String line = br.readLine();
          if (line == null) {
            System.out.println("온도 수집을 종료합니다.");
            System.out.println();
            break;
          } else {
            System.out.println(line); // 수집된 온도를 출력
              pw.println(line);// 파일에 기록
          }
        }
        
        pw.println("----------------------------------------------");
        pw.println("수집 종료 시간: " + new Date().toLocaleString());
        pw.println("----------------------------------------------");
        pw.println();
        
        try {
          pw.close();
        } catch(Exception e) {
        }
        try {
          writer.close();
        } catch(Exception e) {
        }
        try {
          br.close();
        } catch(Exception e) {
        }      
        try {
          socket.close();
        } catch(Exception e) {
        }   
 
      }
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
 
      try {
        server.close();
      } catch(Exception e) {
      }  
    }
  }
 
}
 
-----------------------------------------------------------------------------------
 

 
2. Client
   - 영하 5도이면 수집을 종료합니다.
 
▷ network.CollectClient2.java
java network.CollectClient2 172.16.12.1 2010
-------------------------------------------------------------
package network;
 
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Random;
 
public class CollectClient2 {
 
  public static void main(String[] args) {
    Socket socket = null;         // 데이터 송수신
    InetAddress inet = null;     // 접속 정보
    
    OutputStream os = null;  // 네트워크 전송
    OutputStreamWriter osw = null; // 출력시 한글을 코드로 변환 처리
    BufferedWriter bw = null;    // 출력할 데이터를 메모리에 저장
 
    try {
      socket = new Socket(args[0], Integer.parseInt(args[1])); // 서버에 연결 요청, ip, port
      inet = socket.getInetAddress();
      System.out.println("접속된 Server IP: " + inet.getHostAddress());
      
      bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
      
      while(true) {
        Thread.sleep(3000);
            .....     
        int temp = rnd.nextInt(11) - 5; // 0 ~ 10 -> -5 ~ 5 
        System.out.println("온도: " + temp);
        
        bw.write(String.valueOf(temp)); // int -> String
        bw.newLine();  // 2개 이상의 문장 전송
        bw.flush(); // 네트워크로 전송
        
        if (temp == -5) {
          System.out.println("데이터 수집을 종료합니다.");
          break;
        }
        
      }
      
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally {
      try {
        bw.close();
      } catch(Exception e) {
      }
      
      try {
        socket.close();
      } catch(Exception e) {
      }      
    }
    
 
  }
 
}
 

 ->답
package network;
 
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Random;
 
public class CollectClient2 {
 
  public static void main(String[] args) {
    Socket socket = null;         // 데이터 송수신
    InetAddress inet = null;     // 접속 정보
    
    OutputStream os = null;  // 네트워크 전송
    OutputStreamWriter osw = null; // 출력시 한글을 코드로 변환 처리
    BufferedWriter bw = null;    // 출력할 데이터를 메모리에 저장
 
    try {
      socket = new Socket(args[0], Integer.parseInt(args[1])); // 서버에 연결 요청, ip, port
      inet = socket.getInetAddress();
      System.out.println("접속된 Server IP: " + inet.getHostAddress());
      
      bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
      
      while(true) {
        Thread.sleep(3000);
        Random rnd = new Random();
        int temp = rnd.nextInt(11) - 5; // 0 ~ 10 -> -5 ~ 5 
        System.out.println("온도: " + temp);
        
        bw.write(String.valueOf(temp)); // int -> String
        bw.newLine();  // 2개 이상의 문장 전송
        bw.flush(); // 네트워크로 전송
        
        if (temp == -5) {
          System.out.println("데이터 수집을 종료합니다.");
          break;
        }
        
      }
      
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally {
      try {
        bw.close();
      } catch(Exception e) {
      }
      
      try {
        socket.close();
      } catch(Exception e) {
      }      
    }
    
 
  }
 
}
 
 
-------------------------------------------------------------
 
  
3. 기록된 온도 파일

▷ C:/ai3/io/temperature.txt
-----------------------------------------------------------------------------------

----------------------------------------------
현재 온도 수신 센서 위치: 172.16.7.250
수집 시작 시간: 2015. 7. 28 오후 9:36:54
----------------------------------------------
-4
-1
-1
0
0
1
-2
2
-5
----------------------------------------------
수집 종료 시간: 2015. 7. 28 오후 9:37:12
----------------------------------------------
----------------------------------------------
현재 온도 수신 센서 위치: 172.16.7.250
수집 시작 시간: 2015. 7. 28 오후 9:37:57
----------------------------------------------
-1
5
-2
-3
-1
-5
----------------------------------------------
수집 종료 시간: 2015. 7. 28 오후 9:38:43
----------------------------------------------
 
-----------------------------------------------------------------------------------
 
 

4. 기록된 파일을 읽어오는 클래스

▷ network.ReadFile.java

-----------------------------------------------------------------------------------
package network;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
 
public class ReadFile {
 
  public static void main(String[] args) {
    File file = new File("C:/ai3/io/temperature.txt");
    
    // File -> FileReader -> BufferedReader
    BufferedReader br = null; // 읽은 내용을 메모리에 저장
    
    try {
      br = new BufferedReader(new FileReader(   .....   )); // Call By Reference, 해시코드 전달
 
      while(true) {
        String line =     .....     ; // 파일에서 한 라인씩 읽음
        if (line == null) { // 파일 마지막인지 검사
          break;
        } else {
          System.out.println(line); // 화면 출력
        }
      }
      
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        br.close();
      } catch(Exception e) {
      }
      
    }
    
  }
 
}
 
->답
package network;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
 
public class ReadFile {
 
  public static void main(String[] args) {
    File file = new File("C:/201812_java/io/temperature.txt");
    
    // File -> FileReader -> BufferedReader
    BufferedReader br = null; // 읽은 내용을 메모리에 저장
    
    try {
      br = new BufferedReader(new FileReader(file)); // Call By Reference, 해시코드 전달
 
      while(true) {
        String line = br.readLine(); // 파일에서 한 라인씩 읽음
        if (line == null) { // 파일 마지막인지 검사
          break;
        } else {
          System.out.println(line); // 화면 출력
        }
      }
      
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        br.close();
      } catch(Exception e) {
      }
      
    }
    
  }
 
}
-----------------------------------------------------------------------------------


Comments