소켓 통신이란?
우리는 openStream() 과 같은 메소드로 타입을 바꾸고 그 바뀐타입으로 여러가지 기본적인 통신을 한다. 그런데 이 통신은 default 값으로써 윈도우에서 제공하는 아주 기본적으로 단순한 구조의 통신을 의미한다. 기본적인 통신구조는 잘 알려져 있기 때문에 보안에 취약하다. 그래서 나만의 통신구조를 설계하는데 이를 바로 소켓 프로그래밍이라고 한다.
어떤 단계를 거쳐서 통신이 이루어질까?
1. 먼저 Client class 를 생성한다. 클래스의 파라미터는 보기와 같다.
2. 해당 클래스에 서버의 ip주소와 port 번호를 넣고 출력 스트림으로 넘어간후 Server Socket에 접근한다.
3. Server Socket class는 client가 접속을 했는지 체크만하는 용도이다.
4. 접근이 옴이 인식되면 서버 클래스는 제빨리 Socket.accept() 메소드를 실행한다.
위의 경우는 1:1 통신 방식이고 하나의 서버에 여러 클라이언트가 접속하는 경우에는 어떨까?
클라이언트 1개당 1개의 ServerSocket이 생성된다. 만약 컴퓨터 1000대가 접속한다면 1000개의 서버소켓이 만들어지고
이 1000개의 서버소켓이 1000개의 accept()메소드를 호출하게 되므로 상당히 비효율적이 된다. 이를 개선하기 위해 사용되는게 Thread(쓰레드)이다.
소켓 통신 실습
클라이언트와 서버 클래스를 하나씩 만든다.
서버 측 코드 작성
작성 후 ctrl+f11로 실행을 하면
제일 마지막에 작성한 접속 되었습니다!! 라는 문구가 뜨질 않는다. accept()메소드는 누군가의 접속을 기다리는 메소드라 생각하면 된다. accept() 메소드의 리턴값(결과값) 즉, Socket에는 접속한 사용자의 정보가 들어있다. 이 정보를 토대로 응답을 해줄 수 있다.
클라이언트 측 코드 작성
일단 내 자신과 통신 테스트를 해보자.
cmd - ipconfig을 실행하여 ip를 확인 후 Sock 참조변수의 매개변수로 ip와 포트번호를 입력하자.
서버 main 클래스를 먼저 실행하고 클라이언트 main 클래스를 실행하자.
서버 main에서 accept()메소드가 실행되었음을 알 수 있다.
(통신 가능한 환경이 구축 완료되었다.)
이제 데이터를 한번 전송해보자.
이제 서버쪽에서 데이터를 받아줘야 하므로 코드를 추가한다.
주의 : import할 때 내가 어떤 패키지의 클래스를 import하는지 항상 체크할 것
서버측과 클라이언트 측을 같이 보기 위해 console창 을 하나 더 띄운다.
현재 출력되는 콘솔창을 선택
참고
서버에 있는 read() 메소드와 클라이언트의 write()메소드는 한쌍이다.
write(data)를 입력하는 순간 바로 read()로 넘어간다.
클라이언트와 서버 클래스를 각각 하나씩 더 만들자
클라이언트 측 코드 작성
서버측 코드 작성
getHostAddress : 문자열 형태로 반환
getInetAddress() : InetAddress 자료형으로 반환
출력 결과
1) 서버
2) 클라이언트
스레드 적용
클라이언트와 서버 클래스 하나씩 만들기 + UserThread 클래스 추가
UserThread 클래스 코드 추가 작성
이렇게 Thread 클래스를 추가하여 적용시키면 1:1 소켓 통신이 정상적으로 구현된다.
'IT > 국비과정' 카테고리의 다른 글
JavaFX 실습 : fx컨트롤러 (0) | 2020.10.09 |
---|---|
JavaFX 실습 : 이미지 처리 (0) | 2020.10.08 |
Java 국비과정 : Java 데이터베이스 연동 (0) | 2020.10.04 |
JAVA 연습문제(국비) : 사원관리 프로그램 (0) | 2020.10.02 |
JAVA 연습문제 (국비) : 학생 출석 프로그램 만들기 (0) | 2020.10.01 |