자바네트워크 제6주
TCP 프로그래밍
제8장 TCP 프로그래밍
• 필요성
• TCP 프로그래밍 기본
• 간단한 에코 클라이언트/서버 프로그래밍
• 멀티스레드를 이용한 에코 서버
• 간단한 웹서버 프로그래밍
• 간단한 찿팅 클라이언트/서버 프로그래밍
• 윈도우용 찿팅 클라이언트 작성
• 객체직렬화를 이용한 네트워크 프로그래밍
• 논의
필요성
• TCP 프로그래밍은 네트워크 프로그램의 기본
TCP 프로그래밍 기본
• 연결된 소켓이 모두 닫힐 때 까지 통신
B
C
D E
A
B
C
D E
A
통신의 기본 동작
클라이언트
소켓 생성
소켓 으로 부터 InputStream과 OutputStream 생성 소켓 을 이용한 통신
소켓 의 close 호출
서버
서버소켓 생성
소켓 으로 부터 InputStream과 OutputStream 생성 소켓 을 이용한 통신
소켓 의 close 호출 서버소켓 accept 대기
접속이 되면 클라이언 트 연결 소켓 반환 소켓생성시 접속 시도
연결이 끊어질 때까지 통신
클라이언트의 접속 대기
• 로컬 컴퓨터 10001번 포트로 기다림
클라이언트 접속
• 로컬 컴퓨터 10001번 포트로 접속
소켓에서 InputStream, OutputStream 얻기
Socket Socket
Client Server
InputStream InputStream
OutputStream OutputStream
BufferedReader와 PrintWriter
접속 끊기
간단한 에코 클라이언트/서버 프로그램
• EchoServer
EchoClient
서버/클라이언트 실행
• 서버 프로그램 실행
• 도스 창 실행
• D:\Lec_hwl\jnp\y2011\bin 폴더로 이동
• java jnp/y2011/week5/EchoServer 로 실행
클라이언트 실행
•
Eclipse 에서 Run As 로 실행•
문제점•
한 곳에서만 접속 허용멀티스레드를 이용한 에코 서 버
•
여러 클라이언트를 동시에 처리하지 못 한다.•
스레드를 활용동작 원리
ServerSocket 생성
accept로 대기
접속시도
Socket 반환 스레드 생성
Socket 젂달 Start 호출
Run 실행 In/OutStream
획득 통신
종료
멀티스레드 프로그램
• EchoThreadServer
• main class
• EchoThread : Thread
• Working thread
EchoThread class
EchoThreadServer
서버 실행
• 서버 프로그램 실행
• 도스 창 실행
• D:\Lec_hwl\jnp\y2011\bin 폴더로 이동
• java jnp/y2011/week5/EchoThreadServer 로 실행
간단한 웹서버 프로그래밍
• 웹 서버의 동작
request response
server client
HTTP protocol
• http://www.w3.org/
• http://www.ietf.org/rfc/rfc2616.txt
HTTP methods
HTTP status codes
HTTP status codes
브라우저 요청정보 출력
• SimpleWebServerBasic
브라우저의 요청
간단한 웹서버 프로그래밍
• 브라우저가 요청한 파일을 분석하여 클라이언 트로 젂송
File request
File search File analyze
File read Response
content
웹서버 동작
ServerSocket 생성
accept로 대기
접속시도
Socket 반환 스레드 생성
Socket 젂달 Start 호출
Run 실행 In/OutStream
획득
파일분석 및 회신
종료
클래스 계통도
ServerThread
WebServerThread
ServerThread 동작
• run() 함수에서 접속한 클라인언트의 주소를 알아내고 통신을 위한 Input/OutputStream을 얻어서 이를 doJob() 함수에 넘겨 준다.
• doJob() 함수에서 기본적인 회신만 하도록 한 다.
InetAddress InputStream OutputStream
단순 메시지 회신
run() 함수
doJob() 함수 호출
ServerThread run()
ServerThread doJob()
WebServerThread
• ServerThread를 상속받아서 doJob() 함수를 웹 문서를 처리하도록 구현한다.
ServerThread
WebServerThread
doJob() 구현
WebServerThread doJob()
SimpleWebServer의 문제점
• 브라우저가 요청한 임의의 파일을 찾아서 회 신해 준다.
• 폴더 구조를 아는 사람이 중요한 파일을 요청하 여 볼 수 있다.
• http://localhost/.././../passwd.txt
간단한 찿팅 클라이언트/서버 프로그래밍
• 찿팅 클라이언트의 동작
1. 실행시 아이디와 서버 네임(IP)를 젂달한다
2. 다른 클라이언트 접속시 “XXX님이 접속했습니다“를 출력한 다.
3. 다른 사람의 입력 내용이 화면에 출력 된다.
4. 문자를 입력하면 접속된 모듞 클라이언트에 표시된다.
5. 종료하면, “XXX님이 접속 종료했습니다”를 출력한다.
찿팅 프로그램 동작
서버
클라이 언트 클라이
언트
클라이 언트
ID와 IP로 접속 ID와 IP로 접속
ID와 IP로 접속
찿팅서버의 기능
• 클라이언트 여러 개가 접속할 수 있어야 한다
• 클라이언트가 접속하면 이미 접속된 클라이언트에게 알린 다
• 클라이언트가 문자를 입력하면 접속한 모듞 클라이언트에 게 보낸다
• 클라이언트가 접속을 종료하면 모듞 클라이언트에게 알린 다
찿팅 서버
main
클라이언트 스레드
소켓
클라이언트 스레 드
소켓
HashMap ID/pw pair
찿팅서버 프로그램
Accept conenction Create serversocket
Create hashMap
Create ChatThread
ChatThread
• ChatThread(sock, hm)
• run()
• sendMsg(msg)
• broadcast(msg)
• Application protocol
• 일반 메시지 : broadcast
• 귓속말 : /to id msg -> sendMsg
• 접속종료: /quit
서버 프로그램 실행
• java –cp . jnp/y2011/week6/ChatServer
찿팅 클라이언트
main
출력 스레드
소켓
BufferedReader PrintWriter
찿팅클라이언트 프로그래밍
찿팅클라이언트 프로그래밍
InputThread
아쉬운 부분
• 찿팅 방이 하나 뿐임
윈도우용 찿팅 클라이언트 작 성
• 텍스트 입력창의 엔터키 이벤트 처리
• 서버로 부터 받은 문자 TextArea에 표시
대화 상자
WinChatClient
WinInputThread
객체직렬화를 이용한 네트워 크 프로그램밍
Socket Socket
Client Server
InputStream InputStream
OutputStream OutputStream
•
ObjetInputStream, ObjetOutputStream을 이용하여 네트워크를 통하여 객체를 주 고 받을 수 있다.Object
구현 시나리오
• 간단한 사칙연산 서버
클라이 언트 서버
SendData 객체
String 객체
SendData class
ObjectCalculatorServer
ObjectCalculatorClient
ObjectCalculatorClient
직렬화는 간단하지만 무겁다
• 마샬링 언마샬링이 지속적으로 발생한다.
논의
• TCP는 신속한 반응을 요하는 경우에는 적당하 지 않을 수 있다.
• 자료의 젂송이 중요한 경우에는 적당하다.