본문 바로가기

언어/Java

네트워크

※ 네트워크(network)는 여러 컴퓨터들을 통신 회선으로 연결한 것

LAN(Local Area Network)은 가정, 회사, 건물, 특정 영역에 존재하는 컴퓨터를 연결한 것

WAN(Wide Area Network)은 LAN을 연결한 것. WAN이 우리가 흔히 말하는 인터넷(Internet)

 

네트워크에서 유무선으로 컴퓨터가 연결되어 있다면 실제로 데이터를 주고 받는 행위는 프로그램들이 한다.

서비스를 제공하는 프로그램을 일반적으로 서버(server)라고 부르고, 서비스를 요청하는 프로그램을 클라이언트(client)라고 부른다. 서버는 서비스를 하는쪽, 클라이언트는 서비스를 요구하는 쪽

 

 IP(Internet Protocol)  주소

건물주소, Port 건물에 들어가있는 각 사무실 1호 2호 3호

컴퓨터의 고유한 주소. IP주소는 네트워크 어댑터(LAN 카드)마다 할당된다.

 

  Port 번호

Port는 운영체제가 관리하는 서버 프로그램의 연결 번호이다. 서버는 시작할 때 특정 Port 번호에 바인딩한다. IP는 컴퓨터의 네트워크 어댑터까지만 갈 수 있는 정보이기 때문에, 컴퓨터 내부에서 실행하는 서버를 선택하기 위해서는 추가적인 Port 번호가 필요하다.

 

클라이언트도 서버에서 보낸 정보를 받기 위해서는 Port 번호가 필요한데, 서버와 같이 고정적인 Port 번호에 바인딩하는 것이 아니라 운영체제가 자동으로 부여하는 번호를 사용한다. Port번호는 0~ 65535번까지 가능. 프로세스에게 할당.

범위 설명
0~1023 국제인터넷주소관리기구(ICANN)가 특정 애플리케이션용으로 미리 예약한 Port
1024~49151 회사에서 등록해서 사용할 수 있는 Port
49152~65535 운영체제가 부여하는 동적 Port 또는 개인적인 목적으로 사용할 수 있는 Port

 

※ IP 주소 얻기

InetAddress를 이용하면 로컬 컴퓨터의 IP 주소를 얻을 수 있고, 도메인 이름으로 DNS에서 검색한 후 IP주소를 가져올 수도 있다.

//로컬 컴퓨터의 InetAddress 얻기
InetAddress ia = InetAddress.getLocalHost();

// 컴퓨터 도메인 이름얻기
InetAddress ia = InetAddress.getByName(String domainName);

소켓과 연결된 상대편 ip

 

  TCP(Transmission Control Protocol)와 UDP(User Datagram Protocol)

IP주소로 프로그램들이 통신할 때는 약속된 데이터 전송 규약이 있다. 이것을 전송용 프로토콜이라고 부른다.

인터넷에서 전송용 프로토콜은 TCP와 UDP가 있다. TCP 전화, UDP 편지로 예를 든다. 소켓이 데이터를 주고받을 때 사용하는 엔드포인트. 속도가 중요하면 udp, 신뢰성이 중요하면 tcp

 

- TCP
서버프로그램이 실행됐을때 서버를 열게되면 클라이언트들이 접속 가능
클라이언트는 그 서버에 접속을 해야함. 접속할 서버 IP와 포트번호 정확히 알고 접속해야함

연결지향, 보내고 확인. 처리속도 느림. 클라이언트와 서버가 미리 연결이 되어야함

 

- UDP

비연결성, 보내고 끝. 처리속도 빠르나 신뢰성 떨어짐, 발신자가 일방적으로 수신자에게 데이터를 보내는 방식

여러 회선을 통해 데이터가 전송되기 때문에 특정 회선의 속도에 따라 데이터가 순서대로 전달되지 않거나 잘못된 회선으로 인해 데이터 손실이 발생할 수 있다.

 

서버 주고받는 1번 과정

ServerSocket ss = new ServerSocket(5432); // 서버소켓 라이브러리, 포트 오픈
Socket s = ss.accept(); // 클라이언트들을 기다림.

Socket s = new Socket(서버IP, 5432); // 접속 시도

Socket : Network서버의 엔드포인트, 클라이언트에 원뿔같은 그림이 소켓

클라이언트쪽에서 데이터를 보내려면 소켓과 연결된 OutputStream을 얻어내야함
그래야 그 Stream을 통해서 write 가능
OutputStream os = s.getOutputStream(); //목적지를 Socket, byte단위로 직접 써도 되지만 가공
os.write(65); // byte에 해당하는 A

서버는 저 쓴 내용을 읽어야함, 상응하는 InputStream객체 만들어야함
InputStream is = s.getInputStream();
int readValue = is.read(); // 이걸 1byte씩 read
sop((char)readValue); // 그 byte를 읽어서 문자로 형변환, 결과는 A

이번엔 서버가 클라이언트에 데이터 보내기
서버와 연결된 OutputStream

소켓이 한쪽이 망가지면 상대편도 같이 쓸모가 없어짐, 그래서 소켓프로그램에서는 제일 중요한게 예외처리

s.close(); // 서버에 close, 연결된 한 클라이언트의 연결을 끊는것. 서버 중지X 다음 클라이언트 기다리러 
주로 다시 반복문을 이용해 위로 올라감
s.close(); // 

 

서버를 열었다. 실행이 정상이다. 5432 포트번호가 사용가능하다는 뜻 콘솔창에 메시지 없는게 정상
허용 해줘야 함

※ 내 ip 검색

cmd > ipconfig

127.0.0.1 내가 인터넷이 연결되있지않아도 사용가능한 자기 컴퓨터 ip, 로컬호스트라고도 부름
내 ip는 IPv4주소

 

서버 안끈 상태로 클라이언트 test도 실행하면 콘솔 2개 켜짐

 

'언어 > Java' 카테고리의 다른 글

네트워크 예제 2  (0) 2023.08.16
네트워크 예제 1  (0) 2023.08.16
스레드 안전 종료  (0) 2023.08.16
스레드 동기화  (0) 2023.08.16
스레드 상태  (0) 2023.08.16