Wanna be Brilliant Full-Stack Developer

JAVA 소켓 통신 #3 클라이언트 소켓 본문

Some Memos/Java

JAVA 소켓 통신 #3 클라이언트 소켓

Flashpacker 2023. 4. 25. 16:15

클라이언트소켓을 만들어보자!

서버 소켓은 필요없고 Socket이 필요하다.

BufferedReader가 아니라 BufferedWriter가 필요하다. 서버쪽으로 글을 쓰기 때문이다. 

생성자를 만들고 클라이언트 소켓 시작이라는 메시지를 주고 

new ClientFile()하면 저 메시지가 뜰것이다

.저 소켓은 버퍼로부터 읽기 때문에 Input이고 

클라이언트 소켓은 어떤 버퍼를 다는가? 버퍼를 다는데 쓰기 때문에 output하는 버퍼가 필요하다.

14번 라인이 실행될때 무슨일이 일어나는가? 서버소켓의 accept() 메서드가 호출 된다. 

그러면서 소켓이 만들어진다. 즉! 이 두 소켓(소켓, 클라이언트 소켓)이 연결이 되는것이다.

연결이 되고 나서 BufferedWriter를 달아야한다.  

쓰는 어떤 정수를 문자로 바꿔주는것이 OutputStreamWriter이다. 연결되는 소켓은 둘다 선에 연결 될것인데

서버 입장에서는 input, 클라이언트 소켓 입장에서는 output이다.

 

이제 연결이 되었으니까 메시지를 쓰면 되는데 키보드로부터 입력 받아서 쓰고 싶다고 하면!

키보드에 연결 해보려고 한다!

키보드에 연결을 위해서 BufferedReader을 하나 만든다! 

키보드와 연결하고나서 br.readLine()이라고 키보드 메시지를 받아서

메시지를 보내게되는데 메시지의 끝을 알려줘야한다. 끝났다를 알려주기 위해 역슬래쉬 n이 필요하다!

이건 통신의 규칙이다.

또한 버퍼가 엄청나게 크기 때문에 강제로 버퍼를 비워주는 flush라는 메서드를 호출해야한다. 

ip주소가 localhost로 변경을 해야하는데? 

우리가 전세계에 수많은 네트워크 장비들이 있는데! 컴퓨터도 있고 TV 등등이 있다. 

이렇게 있으면 만약에 서로 통신하고 싶으면 서로의 주소를 알고 있어야하는데 주소체계가 어떻게 되어있는가하면?

 

IPv4 체계가 있는데 000.000.000.000 런 방식으로 되어 있는데! 총 경우의 수가 각각 2의 8승!

각 4개를 더하면 2의 32승이고 10진수로 표현하면 42억 9천이다. 전세계에는 42억 9천개의 주소가 존재한다.

 

예를 ㄷ르어보면 210.10.8.254라는게 있으면? 이런 주소가 집마다 유일하게 하나씩 있다.

그 사람 집을 유일하게 특정할 수 있는 집 주소라고 생각하면 된다. 중복 되지 않는다. 중복되면 어디로 이동할지 모르기 때문이다. 서로 stream으로 연결하려면 각 컴퓨터의 IP주소를 알아야한다.

내 컴퓨터가 자기 자신의 IP를 표현할때는 만약에 실제 IP가 110.5.8.7이라면 다른 애들은 애를 찾기 위해서 

이 IP주소를 알아야한다.

근데 자기가 본인 스스로를 나타내는 주소가 있다.

그것이 무엇인가하면? 127.0.0.1이다. 이건 자기 자신을 나타내는 주소이다. 각각 자기 자신을 나타내는 주소가 저것인데?

그걸 문자열로 나타낸 주소가 localhost인데 서로 같은 의미이다. 

이제 최종그림을 한번 그려보자면!

소켓과 소켓이 있을때 하나는 클라이언트 쪽이고 하나는 서버쪽이다.

이 두개가 서로 스트림이 연결이 된다. 연결이 되는데 클라이언트 쪽에서 서버쪽으로 연결을 한것이고

서버는 10000번 포트로 기다리고 있었다. 연결을 위해 소켓이 서로 연결이 되었는데

실제로는 서버 소켓이라는것에 연결이 된것이다.

연결을 시도할때는 Localhost:10000 이렇게 가고 연결이 되니까 소켓이 만들어졌다.

여기에도 포트가 필요한데 Random Port가 만들어졌다.

버퍼가 만들어지는데 서버 소켓은 읽는 버퍼 (read) 버퍼가 들어온다.

클라이언트는 버퍼가 write하는 버퍼를 만든다. 

그리고 이 클라이언트 컴퓨터는 다른곳에서도 연결이 되어 있는데 

어디에 연결이 되어있는가? 스트림이 하나가 더 있는데 여기가 어디일까?

바로 키보드이다. 키보드로부터 데이터를 받을거니까 Read하는 버퍼가 또 생긴다.

그러면 어떻게 할것인가? 키보드로부터 데이터를 이제 입력 받을것이다. 

Write버퍼쪽으로 던져서 끝에는 역슬러시 n을 걸고 

애를 Flush를 하면 저기가 비워지고 스트림으로 메시지가 전송이 된다. 

Read버퍼에 Abc가 들어오고 읽어서 모니터에 출력 할것이다.

 

 

 

'Some Memos > Java' 카테고리의 다른 글

JAVA 이벤트 리스너 원리  (0) 2023.05.24
JAVA 소켓통신 실습(스레드)  (1) 2023.04.25
Java 소켓통신 #2  (0) 2023.04.19
JAVA 소켓통신의 개념 #1  (0) 2023.04.13
Java BufferedReader란?  (0) 2023.04.13