티스토리 뷰

 앞서 프로세스에 대한 정의와 java 프로그래밍에서 프로세스를 만드는 방법에 대해 알아봤다. 하지만 우리는 java 프로그램을 통해 외부 프로세스를 정의하는데 그치지 않는다. 프로세스를 완벽하게 제어하는데 관심이 있을 것이다. 프로세스 처리 영역은 운영체제의 몫이다. 그렇기 때문에 JVM에서 프로세스 사용 목록을 알기 위해서는 별도의 함수 사용이 필요하다.


    1. Process Input/Output Stream


 Java에서 데이터를 입력하고 받는 것은 Stream 구조로 되어 있다. Java에서 제어하는 프로세스 역시 Stream으로 데이터를 주고 받는다. 또한 Process 클래스에서 스트림에 대한 메소드가 정의 되어 있다. 만약 프로세스의 데이터 제어가 필요한 경우 이 Stream 클래스와 메소드를 사용하면 된다.


  • getOutputStream () : 프로세스의 출력 스트림을 실행 시킨다.

  • getInputStream () : 프로세스의 입력 스트림을 실행 시킨다.

  • getErrorStream () : 프로스세의 에러 스트림을 실행 시킨다.


 아래는 java process 클래스에서 스트림 메소드를 사용한 예시이다.


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

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

 

public class Solution {

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

 

        try {

            Process process = Runtime.getRuntime ().exec ("notepad.exe");

            OutputStream stdin = process.getOutputStream ();

            InputStream stderr = process.getErrorStream ();

            InputStream stdout = process.getInputStream ();

            

            BufferedReader reader = new BufferedReader (new InputStreamReader(stdout));

            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));

            

            

        } catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        

        

        

    }

 

}

Colored by Color Scripter

cs



  저번 시간에 말한대로 프로세스를 실행 시키기 위한 런타임 프로세스로 프로세스 클래스를 만든다. 위에 있는 코드에서 프로세스 클래스는 process다. 해당 프로세스의 InputStream / OutputStream / ErrorStream을 만들기 위해, 프로세스 클래스의 메소드를 각각 사용한 것이다.


그리고 프로세스 제어를 위한 reader와 writer를 선언한다. reader와 writer는 Buffered로 선언을 했다. 


2. 실행 프로세스 정보 가져오기



 현재 CPU에서 실행되고 있는 프로세스의 정보를 자바 프로그램으로 가져올 수 있다. cmd에서 명령어 "netstat -a -o"를 입력한다면 아래와 같이 각 포트주소의 상태와 process ID를 얻을 수 있다.




아래와 같이 프로그램을 작성한다면 Java 프로그래밍을 통해 포트 번호에서의 process ID를 얻을 수 있다.


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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
 
public class Solution {
 
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        
        Scanner sc = new Scanner(System.in);
        int port = sc.nextInt();
        int pid = getProcessID(port);
        System.out.println(pid);
        
    }
    
    public static int getProcessID(int port) throws IOException {
        Process process = new ProcessBuilder("cmd""/c""netstat -a -o").start();
        BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line;
        while ((line = br.readLine()) != null) {
            if (line.contains(":" + port)) {
                while (line.contains("  ")) {
                    line = line.replaceAll("  "" ");
                }
                int pid = Integer.valueOf(line.split(" ")[5]);
                process.destroy();
                return pid;
            }
        }
        return -1;
    }
 
}
cs


3. Java 프로그램과 프로세스의 상호 작용



  결국 우린 프로세스를 통해 궁극적으로 하고 싶은 것은 프로세스의 제어다. Java 프로그래밍을 통해서 우리가 강제로 프로세스를 실행 시키기도 하고 종료시키기도 하면서 프로그램의 성능을 높이거나 입출력을 실행 시키고자 할 것이다. 자, 앞서 배운 이론들을 활용해 한번 프로세스를 어떻게 제어하는 지 알아보자.


  네트워크를 작동 시키기 위해서는 도달하려는 IP와의 연결이 되어 있어야 한다. 해당 IP에 연결하기 위해서 하는 작업이 ping 테스트다. 가령, 우리가 인터넷에 연결한 뒤 구글 사이트에 들어가려고 한다. 구글 사이트에 들어가기 위해서는 DNS에 저장 되어 있을 구글의 도메인 주소를 웹 브라우저 주소창에 입력하면 된다. 근데 접속이 안된다고 하면 여러가지 테스트를 해봐야 겠지만 우선 적으로 ping 테스트를 실시한다. 해당 서버와 내 클라이언트 간에 연결이 정상적으로 작동 되고 있는지 파악 할 수 있다. 


  Ping 테스트는 CMD 창에서 쉽게 할 수 있다. 명령어도 ping이다. 만약 구글 IP 주소인 173.194.126.240을 알고 있다면 아래와 같은 방법으로 ping 테스트를 진행하면 된다.



  아쉽게도, 구글의 경우 ping테스트를 막아놔서 저렇게 손실로 나오게 된다. 만약 ping테스트를 성공했다면 아래와 같이 나오게 된다.




  이제 Java 프로세스를 통해서 ping 테스트를 실행하고 콘솔로 결과 값을 받아 보자.


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
import java.io.IOException;
import java.io.OutputStream;
 
public class Solution {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
 
        try {
            Process process = Runtime.getRuntime().exec("ping 173.194.126.240");
            byte[] msg = new byte[128];
            int len;
            while((len=process.getInputStream().read(msg)) > 0) {
                System.out.print(new String(msg, 0, len));
            }
            String rs = "n";
            byte[] rb  = new byte[] { (byte)'n' } ;
            OutputStream os = process.getOutputStream();
            os.write(rb);
            os.close();
 
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
        
    }
 
}
cs


  프로그램을 실행 시키면 아래와 같은 결과값을 얻을 수 있다.





<참고 자료>

스택오버플로우 : https://stackoverflow.com/questions/3643939/java-process-with-input-output-stream

티스토리 블로그 : https://boxfoxs.tistory.com/290

'Skill > Programming - Network' 카테고리의 다른 글

6. 스레드 폴링, 콜백  (0) 2019.05.07
5. 스레드(Thread)  (0) 2019.04.27
3. 프로세스(Process)  (0) 2019.03.27
2. 스트림 (Stream)  (0) 2019.03.03
1. OSI 7계층  (1) 2019.02.17
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/10   »
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
글 보관함