자바

Network

khon98 2020. 7. 15. 22:04

네트워크

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

 

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

 

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

 

반드시 알아야 할 용어

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

 

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

 

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

 

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

 

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

 

서버 프로그래밍 시나리오

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

 

- 사용자 접속을 대기한다 접속을 대기하게 되면 일시 정지가 된다

 

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

 

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

 

- 데이터를 송수신한다

 

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

 

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

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

 

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

 

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

 

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

 

*가급적 포트 번호는 만번 이상으로 쓸 것  만 번 이하 번호는 다른 프로그램이 쓰고 있을 확률이 높음

 127.0.0.1은 자기 자신 컴퓨터를 가리키는 ip주소

 

NetWorkServer.java

-----------------------------------------------------------

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.ServerSocket;

import java.net.Socket;

 

try {

     // 서버 소켓을 생성한다

     ServerSocket server = new ServerSocket(52397);

 

     // 사용자 접속 대기

     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( );

}catch(Exception e) { }

-----------------------------------------------------------

 

NetWorkClient.java

-----------------------------------------------------------

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.Socket;

 

try {

     // 소켓 객체 생성(서버 접속)

     Socket socket = new Socket("127.0.0.1", 52397);

 

     // 스트림 추출

     InputStream is = socket.getInputStream( );

     OutputStream os = socket.getOutputStream( ):

     DataInputStream dis = new DataInputStream(is);

     DataOutputStream dos = new DataOutputStream(os);

 

     // 데이터 송수신

     String recData = dis.readUTF( );

     dos.wirteUTF("클라이언트가 보낸 메시지입니다");

     System.out.println(recData);

 

     // 접속 종료

     socket.close( ):

}catch(Exception e) { }

-----------------------------------------------------------