소켓 (Socket) 이란?
- 네트워크 상에서 수행되는 두 프로그램 간 [ (EX) Client -> Server ]의 양방향 통신 링크의 한쪽 끝 단을 의미한다.
- 특정 포트 번호와 연결되어 있다
-> TCP에서 데이터를 보낼 응용 프로그램을 식별할 수 있다.
- 서버 소켓과 클라이언트 소켓으로 분류 할 수 있다.
• 통신 방식
- 서버 IP와 서버 Port를 가진 클라이언트 서버에서 서버 Port를 가진 Server Socket으로 접속 신호를 보낸다
서버 소켓은 또 다른 소켓을 생성하면서 클라이언트에서 요청을 보냈다 라는 인식을 하게 된다.
- 서버 소켓은 클라이언트에서 정상적으로 접속이 되었는지 여부만 파악하고 새로 생성된 소켓에서 실제 데이터들이 통신 된다.
- Clinet Socket -> Server Socket -> (서버 단에서 ) 새로 생성된 Socket
• Socket Class
- 클라이언트 소켓에서 사용되는 클래스
생성자 | 설명 |
Socket(InetAddress addressm, int port) | 소켓을 생성하여 지정된 IP 주소와 포트 번호에 연결 |
Socket(String host, int port) | 소켓을 생성하여 지정된 호스트와 포트 번호에 연결 호스트 이름이 null인 경우 루프백 주소(locathost) 로 가정 |
• ServerSocket Class
- Client에서 접속이 정상적으로 되었는지 여부를 파악하는 클래스
public class DemoServer {
public static void main(String[] args) throws Exception {
int port = 3030;
int number = Integer.parseInt(args[0]);
String str = new String(args[1]);
ServerSocket serverSocket = new ServerSocket(port);
System.out.println(" 접속 대기 중");
while(true){
Socket socket = serverSocket.accept();
System.out.println("사용자 접속 완료.");
// 사용자와 연결된 IP 가져오기, DemoClient에서 사용한 IP 주소값을 가져온다.
System.out.println("클라이언트 IP " + socket.getinetAddress());
// STEP2
// 클라이언트와 연결을 위한 스트림 생성
OutputStream outputStream = socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.write(str);
dataOutputStream.writeInt(number);
dataOutputStream.flush();
dataOutputStream.close();
socket.close();
}
}
}
public class DemoClient {
public static void main(String[] args) throws Exception {
// 연결 시 소켓이 생성됨, 연결이 안될 경우 예외가 발생함
Socket socket = new Socket("Client IP 주소", Server에 보낼 Port);
System.out.println("서버와 접속됨");
// STEP2
// Stream을 통한 데이터 읽어오기
InputStream inputStream = socket.getInputStream();
DataOutputStream dataOutputStream = new DataOutputStream(inputStream);
int number = dataOutputStream .readInt();
String str = dataOutputStream.readUTF();
System.out.println("서버에서 전송된 문자 " + str);
System.out.println("서버에서 전송된 값 IP " + number);
dataOutputStream.close();
inputStream.close();
socket.close();
}
}
DemoServer를 실행 시킨 후 DemoClient를 실행 시키면 접속대기 -> 서버와 접속됨 -> 사용자 접속 완료 순으로 확인된다.
에코 서버(EchoServer)
- 미리 준비된 메세지, 클라이언트의 메시지 내용을 그대로 돌려주는 서버
1대1 채팅서버 구현
• ChattingServer
- 서버에 Socket과 ServerSocket 객체 설정 (포트번호 및 접속 상태 확인)
- 클라이언트에게 데이터를 보내기 위한 스트림 생성 (생성자에 구현)
InputStreamReader inputStreamReader = new InputStreamReader(System.in);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
- 클라이언트에게 메세지를 보내기 위한 스트림 생성
PrintWriter printWriter = new PrintWirter(socket.getOutputStream(),true);
- 스레드를 이용하여 클라이언트 메시지 정보를 가지고 있기 implements Runnable
Thread thr = new Thread(this)
thr.start(); // override한 run 메소드 실행 -> 클라이언트의 메시지를 받아서 콘솔에 출력
• ChttingClient
- Socket 설정
- 서버로 보낼 메세지를 입력 받는 스트림
InputStreamReader inputStreamReader = new InputStreamReader(System.in);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
- 서버에게 메세지를 보내기 위한 스트림 생성
PrintWriter printWriter = new PrintWirter(socket.getOutputStream(),true);
- 스레드를 이용하여 서버 메시지 정보를 가지고 있기 implements Runnable
Thread thr = new Thread(this)
thr.start(); // override한 run 메소드 실행 -> 서버 메시지를 받아서 콘솔에 출력
'JAVA' 카테고리의 다른 글
Thread 생명주기 및 주요 메서드 (0) | 2022.05.16 |
---|---|
InetAddress 클래스 (0) | 2022.05.05 |
이메일 보내기 (SMTP 방식) (0) | 2022.04.03 |
Retrofit2 (Java) (0) | 2022.04.02 |
JSON 변환 라이브러리 (Gson,Jackson) (0) | 2022.03.17 |