ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 네트워크
    java 2020. 5. 10. 02:53

    ●네트워크

    -원격지의 컴퓨터와 데이터를 송수신하는 것을 네트워크라고 부른다.

    -자바에서는 서버 프로그래밍을 할 수 있는 도구들과 클라이언트 프로그래밍을 할 수 있는 도구들을 제공한다.

    -제공되는 도구들을 이용해 입출력 스트림을 추출하고 추출한 스트림을 통해 데이터를 송수신하면 된다.

     

    ▶반드시 알아야 할 용어

    -서버 : 서비스를 제공하는 프로그램이다. 클라이언트가 요구하는 데이터를 클라이언트로 전송하는 역할을 한다.

    -클라이언트 : 서비스를 받는 프로그램이다. 서버가 보낸 데이터를 바탕으로 사용자가 서비스를 이용할 수 있도록 구성해주는 역할을 한다.

    -IP : 컴퓨터 시스템이 가지고 있는 주소이다. 전 세계의 컴퓨터는 전부 아이피 주소를 가지고 있다. 아이피 주소가 공인 아이피일 경우 다른 컴퓨터가 쉽게 접근해서 데이터 통신을 할 수 있다. 공유기 등으로 연결되어 사설 아이피를 받았을 경우 외부에서의 접근을 위해서는 다른 방법을 이용해야만 한다.

    -포트 : 하나의 컴퓨터에서 여러 개의 네트워크 프로그램이 동시에 운영될 수도 있다. 각 프로그램 별로 데이터를 올바르게 송수신 할 수 있도록 문의 역할을 해주는 것을 하나씩 할당하게 되는데 이 것이 포트이다.

    -소켓 : 하나의 서버에는 수십 수백의 클라이언트가 연결될 수 있는데 이런 클라이언트는 모두 같은 포트에 접속을 하게 된다. 따라서 서버는 클라이언트와 1:1의 연결 관계가 필요한데 이러한 연결 관계를 유지시켜 주는 것이 소켓이다. 

     

     

    포트는 0~66565중에 하나를 써주면 된다. 서버 프로그램이 가동이 될 때 어떤 포트를 쓰겠다 라고 운영체제에 요구를 하게 되는데 해당 포트를 사용하는 프로그램이 없다면 해당 프로그램이 포트를 사용할 수 있도록 제공을 해주고,  이미 사용하고 있는 포트라고 한다면 사용을 못하게 막아준다.

     

    그런데 이 포트로 접근하고자 하는 클라이언트 프로그램이 굉장히 많을 수 있다. 그래서 소켓이 제공되는데, 클라이언트가 서버의 포트에 접속을 하게되면 이 포트에서 소켓이라는 것이 생성이 되고 클라이언트도 소켓이 생성이 된다. 각각의 소켓에서 스트림을 추출해서 데이터를 주고받을 수 있다. 클라이언트 하나가 해당컴퓨터의 해당 포트로 접속을 하게 되면 클라이언트와 서버의 연결을 주최하기 위해 소켓이 생성된다. 그래서 클라이언트당 하나의 소켓이 생성이 되서, 서버는 무수히 많은 소켓을 가질 수 있다.

     

    ▶서버프로그래밍 시나리오

    -ServerSocket 객체를 생성한다. 이 때, 사용하고자 하는 포트를 할당 받게 된다. 

    -사용자 접속을 대기한다. 접속을 대기하게 되면 일시 정지가 된다. //때문에 쓰레드로 운영을 하는 등 작업이 필요

    -사용자가 접속을 성공하면 Socket객체가 생성된다.

    -생성된 소켓으로 부터 스트림을 추출한다.(필요하다면 필터스트림도 사용한다.)

    -데이터를 송수신한다.

    -모든 통신이 끝났으면 네트워크를 종료한다.

     

    //서버소켓 객체를 생성할 때 몇번 포트를 쓰겠다고 운영체제에 요청을한다. 해당 포트를 쓸 수 있다면 해당 포트를 쓰게 해주고 쓸 수 없다면 오류를 발생시킨다.

     

    ▶클라이언트 프로그래밍 시나리오

    -Socket 객체를 생성한다. 이 때, 접속할 서버 컴퓨터의 아이피 주소와 포트를 입력한다. 접속에 성공을 하면 소켓 객체가 생성이 된다.

    -생성된 소켓으로 부터 스트림을 추출한다.(필요하다면 필터스트림도 사용한다.)

    -추출된 스트림으로 데이터를 송수신한다.

    -데이터 송수신이 완료가 되면 연결을 종료한다.

     

    //서버는 서버 소켓을 생성하고 사용자의 접속을 대기하는 과정을 거친다. 클라이언트는 바로 소켓 객체를 생성을 할 때 컴퓨터에 접속을 하게 된다.

     

    정리

    -자바에서는 네트워크를 위한 여러 가지 도구가 지원된다.

    -서버는 ServerSocket을 먼저 생성해야 한다.

    -서버와 클라이언트에서 각각 소켓 객체가 생성이 되면 이를 통해 스트림을 추출하고 데이터를 송수신 하면 된다.

     

    서버

    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    //서버쪽
    public class NetworkServer {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		try {
    			//서버소켓 생성
    			ServerSocket server = new ServerSocket(33233);
    			//()안에 포트번호를 적어준다.0~65553중에 쓰면 되는데 가급적이면
    			//10000번 이상으로 쓰는 것이 좋다.
    			//10000번 이하의 포트번호는 다른 프로그램들이 이미 쓰고있을 확률이 높다.
    			//ex)인터넷 익스플로러는 80번 포트를 쓰고 있고
    			//ftp같은 프로그램은 21번 포트를 쓰고 있다. 
    			//이렇게 널리 사용되는 포트번호는 대부분 10000번 이하이다.
    			
    			//사용자 접속 대기
    			System.out.println("사용자 접속 대기");
    			Socket socket = server.accept();
    			
    			//스트림 추출
    			InputStream is = socket.getInputStream();
    			OutputStream os = socket.getOutputStream();
    			DataInputStream dis = new DataInputStream(is);
    			DataOutputStream dos = new DataOutputStream(os);
    			
    			//데이터 송수신
    			//서버와 클라이언트가 짝을 맞춰줘야 한다. 서버가 보내면 클라이언트는 받아야 하고,
    			//서버가 받으면 클라이언트는 받아야 한다.
    			dos.writeUTF("서버의 메시지입니다");
    			String recData = dis.readUTF();
    			System.out.println(recData);
    			
    			//접속 종료
    			socket.close();
    			//서버 종료
    			server.close();
    			
    			
    			
    			
    		}catch(Exception e) {
    			
    		}
    	}
    
    }
    

    클라이언트

    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class NetworkClient {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		try {
    			//소켓 객체 생성(서버 접속)
    			Socket socket = new Socket("192.168.128.101",33233);
    			//()안에 아이피 주소와 포트번호를 적어줘야 한다.
    			//아이피 주소 아는 법 : cmd창에 ipconfig를 입력하고
    			//IPv4 주소 부분을 보면 된다.
    			//192.168대로 나오는 아이피 주소를 사용하는 컴퓨터는 외부에서 접속을 못한다.(공유기로 연결되면 192.168로 나온다.)
    			//127.0.0.1은 자기 자신 주소를 가르키는 아이피 주소
    			//연결이 성공이 되면 소켓객체가 생성된다.
    			
    			//스트림 추출
    			InputStream is = socket.getInputStream();
    			OutputStream os = socket.getOutputStream();
    			DataInputStream dis = new DataInputStream(is);
    			DataOutputStream dos = new DataOutputStream(os);
    			
    			//데이터 송수신(서버와 짝을 맞춰야 한다.)
    			//서버에서는 데이터를 보내고, 받고 있기 때문에
    			//클라이언트에서는 먼저 데이터를 받은 후, 데이터를 보내야 한다.
    			String recData = dis.readUTF();
    			dos.writeUTF("클라이언트가 보낸 메시지 입니다.");
    			System.out.println(recData);
    			
    			//접속종료
    			socket.close();
    		}catch(Exception e){
    			
    		}
    	}
    
    }
    

    이 소스코드들을 cmd창에서 워크스페이스에서 각각 프로젝트의 bin 폴더로 들어가 그 안에 있는 클래스 들을 실행시켜 확인해 보는 것이 편하다.

     

    네트워크에 대해 좀더 자세히 공부하고 싶다면 java NIO라는 부분을 좀 더 집중적으로 공부하면 된다. 

     

    참조 : 인프런 - 안드로이드를 위한 자바 - Network

    'java' 카테고리의 다른 글

    ObjectStream  (0) 2020.05.10
    2byteStream  (0) 2020.05.09
    데이터 스트림  (0) 2020.05.09
    FileStream  (0) 2020.05.09
    폴더가 존재하는지 존재하지 않는지 보고 존재하지 않으면 생성  (0) 2020.05.09

    댓글

Designed by Tistory.