[Java] 7-3강 - 네트워킹 with 자바 3 (TCP Socket Programming)
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에서 서버에서 온 것을 화면에 출력.