클라이언트와 서버
컴퓨터간의 관계를 역할(Role)로 구분하는 개념
서비스를 제공하는 쪽은 서버, 제공받는 쪽은 클라이언트라고 한다.
서비스의 종류에 따라서 서버는 파일서버, 메일서버, 웹서버 등이 있다.
전용서버를 두는 것은 '서버기반 모델', 전용서버 없이 각 클라이언트가 서버역할까지 동시에 하는 것을 'P2P모델'
서버기반 모델
- 안정적인 서비스의 제공이 가능하다
- 공유 데이터의 관리와 보안이 용이하다
- 서버구축비용과 관리비용이 든다.
P2P 모델
- 서버구축 및 운용비용을 절감할 수 있다.
- 자원의 활용을 극대화 할 수 있다.
- 자원의 관리가 어렵다.
- 보안이 취약하다.
IP(Internet Protocol)란?
컴퓨터의 호스트(host)를 구별하는데 사용되는 고유한 주소값이다.
4byte의 정수로 표현된다.
IP주소는 네트워크 주소(3byte), 호스트주소(1byte)로 구성된다.
그래서 네트워크 주소가 같은 두 호스트는 같은 네트워크에 존재한다.
IP주소와 서브넷마스크(255.255.255.0)를 '&'연산하면 네트워크 주소를 얻을 수 있다.
호스트 주소는 모두 0으로되어서 네트워크 주소만 얻을 수 있다.
자바에서는 이러한 IP주소를 다루기위해서 InetAddress 클래스를 사용한다.
그래서 도메인 하나에 여러 호스트가 다른 IP주소를 가지고 있을 수 있다.
URL(Uniform Resource Location)이란?
인터넷에 존재하는 서버들의 자원에 접근할 수 있는 주소
구성은 프로토콜/호스트명/포트/경로명/파일명/쿼리/참조 이다.
ex)https://parkjunbackend.tistory.com/manage/newpost/?...
URLConnection이란?
어플리케이션과 URL간의 통신연결을 위한 추상클래스로 선언은 할 수 있지만 저장 시에는 자동으로 상속된 자손클래스로 저장되는 클래스
ex)HttpURLConnection
메서드는 (url객체).openConnection(), (url객체).openStream() 등이 있다.
.openStream()은 URLConnection객체를 생성하고 이에 대한 inputStream을 가져오는것을 한번에 해놓은것이다. InputStreamReader= 문자기반 스트림으로 변화시킨다.
TCP와 UDP
소켓 프로그래밍이란?
소켓을 이용한 통신 프로그래밍을 뜻한다.
소켓이란, 프로세스간의 통신에 사용되는 양쪽 끝단 전화할 때 양쪽에 전화기가 필요한 것처럼, 프로세스간의 통신에서도 양쪽에 소켓이 필요하다.
TCP 소켓 프로그래밍
클라이언트와 서버간의 1:1 소켓 통신
- 서버가 먼저 실행되어 클라이언트의 연결요청을 기다리고 있어야 한다.
- 서버는 소켓을 사용해서 서버의 특정포트에서 클라이언트의 연결요청을 처리할 준비를 한다.
- 클라이언트는 접속할 서버의 IP주소와 포트정보로 소켓을 생성해서 서버에 연결을 요청한다.
- 서버소켓은 클라이언트의 연결요청을 받으면 서버에 새로운 소켓을 생성해서 클라이언트의 소켓과 연결되도록 한다.
- 이제 클라이언트의 소켓과 새로 생성된 서버의 소켓은 서버소켓과 관계없이 1:1 통신을 한다.
ServerSocket, Socket
Socket : 프로세스간의 통신을 담당하며, inputStream, OutputStream을 가지고 있다. 이 두 스트림을 통해 프로세스간의 통신이 이루어진다.
ServerSocket : 포트와 연결되어 외부의 연결요청을 기다리다 연결요청이 들어오면 Socket을 생성해서 소켓과 통신한다.
한 포트에 하나의 ServerSocket만 열결할 수 있다.(프로토콜이 다르면 같은 포트를 공유 할 수는 있다.)
서버소켓의 대기시간을 설정하고 싶은 경우에는 ServerSocket클래스의 setSoTimeout(int timeout) 메서드를 사용한다.
서버가 사용하는 포트번호와 클라이언트가 사용하는 포트번호는 다를 수 있다.
ex)서버의 7777포트에 클라이언트는 예를 들어 8000같은 다른 포트에서 나와 서버의 7777포트와 연결할 수 있다.
서버는 보통 멀티쓰레드로 구성한다.
여러 클라이언트의 요청을 처리하기 위해서 사용한다.
아래는 예시 코드다.
- 채팅만들기 응용
아래의 코드는 1:1채팅을 하기위한 서버 부분의 코드이다.
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class chat {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
try{
serverSocket = new ServerSocket(7777);
System.out.println("서버 준비됨");
socket = serverSocket.accept();
Sender sender = new Sender(socket);
Receiver receiver = new Receiver(socket);
sender.start();
receiver.start();
}
catch (Exception e){}
}
}
class Sender extends Thread{
Socket socket;
DataOutputStream out;
String name;
Sender(Socket socket){
this.socket=socket;
try{
out = new DataOutputStream(socket.getOutputStream());
name = socket.getInetAddress()+","+socket.getPort();
}catch (Exception e){}
}
public void run(){
Scanner sc = new Scanner(System.in);
while (out!=null){
try {
out.writeUTF(name+sc.nextLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
class Receiver extends Thread{
Socket socket;
DataInputStream in;
public Receiver(Socket socket){
this.socket=socket;
try {
in = new DataInputStream(socket.getInputStream());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public void run(){
while (in!=null){
try {
System.out.println(in.readUTF());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
아래의 코드는 클라이언트 부분이다.
import java.io.IOException;
import java.net.Socket;
class client{
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1",7777);
System.out.println("서버 연결");
Sender sender = new Sender(socket);
Receiver receiver = new Receiver(socket);
sender.start();
receiver.start();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
결과는 아래와 같다.
'CS 이론' 카테고리의 다른 글
객체지향과 캡슐화 (0) | 2023.05.02 |
---|---|
SOLID 원칙이란? (1) | 2023.04.12 |
자바의 입출력(I/O) (0) | 2022.11.12 |
Thread 실행제어와 상태 (0) | 2022.11.07 |
프로세스와 프로세서, 쓰레드 개념알기 (0) | 2022.10.30 |