JAVA

[Java] 7-3강 - 네트워킹 with 자바 3 (TCP Socket Programming)

intelligentcm 2020. 12. 24. 10:03

cf> TCP, UDP

0) IP

IP 위에 TCP 혹은 UDP가 있습니다.

IP는 우체국과 같아서 address를 가지고 message를 어디로 전달할 지 알 수 있고

connection 관련 개념이 TCP와 UDP입니다.

1) TCP

reliable data transfer : data loss 없이 잘 전달된다.

1> connection-oriented :먼저 connection을 만드는 과정이 필요 (1:1만 가능)

2> order : data를 받을 때 order가 보존된다.

3> reliablity : data를 항상 안정적으로 전달 받을 수 있다.

4> speed : 전달 속도가 느리다.

2) UDP

(reliablity보다는) 빠른 communication을 원할 때 사용한다.

multicast (여러 host에게 message를 보내는 것)에 사용

broadcast (network안의 모든 host에게 message를 보내는 것)에 사용

1> connectionless : connection과 상관없이 주소를 알면 message를 보낸다. (1:1, 1:n, n:n 모두 가능)

2> order : data를 받을 때 order가 보존되지 않는다.

3> reliablity : data가 전송과정에서 손실될 수 있다.

4> speed : 전달 속도는 빠르다.

 

cf> socket

ip address + port

 

5. TCP Socket Programming

0) (client와 server의) communication 순서

1> server : [1] ServerSocket을 만들고 [2] 특정 port에서 client의 접속을 기다린다. (이 port에 접속해야 서비스 이용 가능)

2> client : [1] Socket을 만든다. (server의 ip address와 port number가 필요) [2] server로 connection request를 보낸다.

3> server : [1] ServerSocket이 client의 request를 받고 [2] client와 통신할 수 있는 Socket을 만듭니다.

 

1) Socket & ServerSocket

1> Socket : InputStream과 OutputStream을 이용해서 communication을 담당합니다.

2> ServerSocket : [1] 특정 port를 bind [2] request를 기다린다. -> [3] communication할 새로운 Socket을 만든다.

 

2) Server

cf> getTime은 현재 시간을 얻어낼 수 있다.

1> ServerSocket instance를 만들고 2> port와 연동한다. 

--- 무한 loop --- => client가 언제든 접속해서 서비스를 이용하게 하려고

3> accept() 호출 : 어떤 client의 request가 올 때까지 block된다.(기다린다.)

4> OutputStream으로 DataOutputStream을 만든다.

5> socket을 통해 message를 network로 보낸다.

 

3) Client

1> server의 IP address와 port number를 알아야 server에 접속할 수 있다.

2> InputStream으로 DataInputStream을 만든다.

3> 서버로부터 온 메시지를 읽는다.

 

 

4) DataInputStream & DataOutputStream

0-1> InputStream : (FileInputStream의 abstract superclass) resource에서 data를 읽어들인다.

0-2> OutputStream : (FileOutputStream의 abstract superclass) resource에 data를 write합니다.

 

1> DataInputStream의 method와 example

2> DataOutputStream의 method와 example

 

 

5) TCP Server using Thread

multiple client를 응대하기 위해 server가 multiple thread를 만드는 경우

1> (Lecture class의 생성자에서) serverSocket을 통해 server의 port number를 설정하고

2> (Lecture class의 생성자에서) 원하는 만큼의 Thread를 array형태로 만든다.

3> thread의 start (thread 만들기)

[1] Lecture의 object(this)로 Thread를 만들어 각 array의 element에 할당하고

[2] 각 thread별로 start (원하는 숫자만큼의 thread를 만들었다.)

4> (5개의 thread를 만들면) run method가 실행된다.

[1] accept() 호출 : 어떤 client의 request가 올 때까지 block된다.(기다린다.) 5개의 thread가 기다리고 있다.

[2] OutputStream으로 DataOutputStream을 만든다.

[3] socket을 통해 message를 network로 보낸다.

 

6) Chat Program using TCP Sockets

2> client

sender : user가 타이핑한 것을 네트워크로 보내는 것

receiver : 네트워크에서 온 것을 화면에 보여주는 것

 

7) Chat Program with Multiple User - MultiChatServer.java

1> client를 관리하는 구조 HashMap으로 만들기

- synchronizedMap으로 thread가 동시에 접근하지 못하도록 만든다.

2> thread의 start만들기

[1] port로 serverSocket 만들고

--- 무한 loop ---

[2] accept() 호출 : 어떤 client의 request가 올 때까지 block된다.(기다린다.) 여러 thread가 기다리고 있다.

[3] serverReceicer의 object를 만들어서 thread를 만든다.

[4] thread start

[5] 일이 끝나면 다시 loop로 돌아와서 다른 client를 기다립니다.

3> sendToAll 메소드 만들기

sendToAll(String msg) : msg를 iterator를 이용한 반복문으로 모든 client에게 msg를 보낸다.

4> ServerReceiver 정의

Thread를 상속받아 MultiChatServer 클래스 안에 클래스를 정의한다.

[1] Socket으로부터 DataInputStream과 DataOutputStream을 만든다.

[2] run method

- in.readUTF() : DataInputStream에서 message를 기다리고

- sendToAll() : 이 message를 전체에게 보낸다.

- clients.put(name, out) : client의 이름으로 hashMap을 만들어 put (접속한 user를 등록)

- while(in != null) {sendToAll(in.readUTF())} : user와 끊어지기 전까지 받은 message를 전체에게 보낸다.

5> discussion

[1] HashMap을 썼을 때 문제점

map은 key가 unique해야하는데 같은 이름의 user가 존재하면 문제가 된다.

[2] sendToAll

message를 전송한 사람도 server의 메시지를 받고 싶다면 따로 설정이 필요

 

8) Chat Program with Multiple User - MultiChatServer.java

1> ClientSenderoutputstream가지고run에서 [1] user의 입력을 받고 [2] name을 서버로 보내고 [3] user의 입력을 보낸다.

 

2> ClientRecieverInputStream가지고run에서 서버에서 온 것을 화면에 출력.