학습목표 자바의소켓포트의개념을이해한다 네트워크프로그래밍 클라이언트통신프로그램의구조를이해한다 소켓과클라이언트소켓을구분하여이해한다 11 주소켓 - 애코김문정 tops@u1.ac.kr 2 포트 (port) 데이터송수신창구 0~65536 (0~1024 : well-known port) ServerSocket 클래스 ( 소켓 ) ServerSocket 클래스에사용되는클래스 java.net 패키지 주요생성자 ServerSocket(int port) 소켓을생성하여지정된포트번호에연결 3 4
ServerSocket 클래스 ( 소켓 ) 메소드 주요메소드 Socket accept() 설명 연결요청을기다리다연결요청이들어오면수락하고새 Socket 객체를반환 void close() 소켓을닫는다. InetAddress getinetaddress() int getlocalport() boolean isbound() boolean isclosed() void setsotimeout(int timeout) 소켓에연결된로컬주소반환 소켓이연결요청을모니터링하는포트번호반환소켓이로컬주소에연결되어있으면 true 반환 소켓이닫혀있으면 true 반환 accept() 에대한타임아웃시간지정 (0= 타임아웃해제 ) 5 Socket 클래스 ( 클라이언트소켓 ) 메소드설명 void close() 소켓을닫는다. void connect(socketaddress endpoint) 소켓을에연결 InetAddress getinetaddress() InputStream getinputstream() InetAddress getlocaladdress() int getlocalport() int getport() OutputStream getoutputstream() boolean isbound() boolean isconnected() boolean isclosed() 6 소켓이연결한의주소반환소켓에대한입력스트림반환소켓이연결된로컬주소반환소켓이연결된로컬포트번호소켓이연결한의포트번호소켓에대한출력스트림반환소켓이로컬주소에연결중인지소켓이에연결되어있는지소켓이닫혀있으면 true 반환 void setsotimeout(int timeout) 데이터읽기타임아웃시간지정. 0 이면타임아웃해제. 클라이언트와연결순서 클라이언트와연결는소켓으로들어오는연결요청을기다림 포트listen 클라이언트가에게연결요청 포트listen 클라이언트포트연결요청 가연결요청수락하고새로운소켓을만들어클라이언트와연결생성 포트listen 포클라이언트포트연결트작업순서 1. 소켓생성 2. 클라이언트로부터접속기다림 ( 소켓생성 ) 3. 네트워크입 / 출력스트림생성 4. 클라이언트로부터데이터수신 5. 클라이언트로데이터전송 6. 소켓종료 7. 소켓종료 7 8
작업순서 소켓생성클라이언트로부터접속기다림네트워크입출력스트림생성클라이언트로부터데이터수신클라이언트로데이터전송네트워크접속종료응용프로그램종료 작업순서 소켓생성 ServerSocket ssoc = new ServerSocket(5550); 이미사용중인포트번호를지정하면오류가발생 클라이언트로부터접속기다림 Socket soc = ssoc.accept(); accept() 메소드는연결요청이오면새로운 Socket 객체반환 에서클라이언트와의데이터통신 : 새 Socket 객체통해 ServerSocket 클래스는주어진연결에대해입출력스트림을만들어주는메소드가없음네트워크입출력스트림생성 BufferedReader in = new BufferedReader(new InputStreamReader(soc.getInputStream())); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(soc.getOutputStream())); accept() 메소드에서얻은 Socket 객체의 getinputstream() 과 getoutputstream() 메소드를이용하여데이터스트림생성 9 10 작업순서 클라이언트로부터데이터수신 Int x = in.read(); // 클라이언트로부터한개의문자수신 String line = in.readline(); // 클라이언트로부터한행의문자열수신 클라이언트작업순서 소켓생성및에접속 네트워크입 / 출력스트림생성 클라이언트로데이터전송 out.write("hi!, Client"+"\n"); flush() : 스트림속에데이터를남기지않고모두전송 네트워크접속종료 응용프로그램종료 ssoc.close(); 로데이터전송 로부터데이터수신 네트워크접속종료 11 12
클라이언트작업순서 소켓생성및에접속 Socket soc = new Socket("128.12.1.1", 5550); 네트워크입출력스트림생성 BufferedReader in = new BufferedReader( new InputStreamReader(soc.getInputStream())); BufferedWriter out = new BufferedWriter( new OutputStreamWriter(soc.getOutputStream())); 로데이터전송 out.write("hello"+"\n"); 실습 1 가보낸메시지를클라이언트가출력하는프로그램 로부터데이터수신 Int x = in.read(); // 한개문자수신 String line = in.readline(); // 한행수신 네트워크접속종료 13 14 public class ServerEx2 { ServerSocket ssoc = new ServerSocket(8899); System.out.println(" 클라이언트연결대기중 "); Socket soc = ssoc.accept(); System.out.println(" 클라이언트연결완료 "); String str = " 유원대학교스마트 IT 학과 ~"; BufferedWriter out = null ; out = new BufferedWriter(new OutputStreamWriter(soc.getOutputStream())); out.write(" >" + str + "\n"); out.close(); ssoc.close(); public class ClientEx2 { Socket soc = new Socket("localhost", 8899); System.out.println(" 연결완료 "); BufferedReader in = null; in = new BufferedReader(new InputStreamReader(soc.getInputStream())); String msg = in.readline(); System.out.println(" 받은메시지 : " + msg); in.close(); } } } } 15 16
실습 2 클라이언트는키보드로입력받아로전송하고 는받은데이터를출력하는프로그램 17 public class EchoServer1 { ServerSocket ssoc = new ServerSocket(8989); System.out.println(" 클라이언트연결대기중 "); Socket soc = ssoc.accept(); System.out.println(" 클라이언트연결완료 "); BufferedReader in = new BufferedReader(new InputStreamReader(soc.getInputStream())); String msg = in.readline(); System.out.println(" 받은메시지 : " + msg); in.close(); ssoc.close(); } } 18 public class EchoClient1 { Socket soc = new Socket("localhost", 8989); System.out.println(" 연결완료 "); BufferedReader stin = new BufferedReader(new InputStreamReader(System.in)); System.out.print(" 입력하세요 : "); String outmsg = stin.readline(); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(soc.getOutputStream())); out.write(" > " + outmsg + "\n"); out.close(); stin.close(); 실습 2-1 클라이언트 Scanner 를이용하여수정할것 19 20 } }
public class EchoClient1 { Socket soc = new Socket("localhost", 8989); System.out.println(" 연결완료 "); Scanner stin = new Scanner(System.in); System.out.print(" 입력하세요 : "); String outmsg = stin.nextline(); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(soc.getOutputStream())); out.write(" > " + outmsg + "\n"); out.close(); stin.close(); } } 21 실습 3 클라이언트는키보드로입력받아로전송하고 는받은데이터를출력하고다시클라이언트로전송하여 클라이언트도출력하는프로그램 22 소켓을이용한클라이언트 / 채팅예제 간단한채팅프로그램예제와클라이언트가 1:1 로채팅 소켓을이용한클라이언트 / 채팅예제 간단한채팅프로그램예제 와클라이언트간의메시지구분을위해는메시지앞에 > 을접두어로붙여메시지를전송클라이언트는 클라이언트 > 를접두어로붙여메시지전송와클라이언트가번갈아가면서메시지전송및수신클라이언트가 bye 를보내면프로그램종료 23 24
프로그램 소켓생성 ServerSocket ssoc = new ServerSocket(9999); 시스템에서사용되지않은포트번호로소켓생성 클라이언트요청대기 Socket soc = ssoc.accept(); 클라이언트가연결요청이올때까지소켓기다림해당포트번호로연결요청이오면 수락과함께새로운소켓을생성 새소켓으로클라이언트와통신새로운소켓의포트번호는자동으로할당 프로그램 클라이언트와통신을위한입출력스트림생성 BufferedReader in = new BufferedReader(new InputStreamReader(soc.getInputStream())); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(soc.getOutputStream())); 스트림을생성하여클라이언트와데이터송수신 데이터의종류에따라바이트스트림또는문자스트림을생성 채팅과같이문자열을송수신하는경우는문자스트림사용 효율적입출력을위하여버퍼스트림 (Buffered Stream) 사용 클라이언트의데이터수신 String inmsg = in.readline(); 스트림생성이후는데이터입력받는방법과동일클라이언트에서한행의문자열을보내올때까지기다림 25 26 프로그램 클라이언트에데이터송신 String outmsg = in.readline(); out.write(" > " + outmsg+"\n"); 스트림생성이후는일반데이터를출력하는방법과동일콘솔에서입력받은문자열을클라이언트로송신 flush() 메소드로스트림의모든데이터를클라이언트로송신 연결종료 ssoc.close(); 데이터의송수신이끝나면소켓을닫아야함소켓을닫으면소켓의입출력스트림도같이닫힘소켓을닫으면클라이언트연결요청을받을수없음 27 클라이언트프로그램 연결요청 soc = new Socket("localhost", 9999); 소켓생성 의호스트주소 가연결요청을모니터링하는포트번호로소켓생성예제는호스트이름을 localhost 로지정 동일한시스템에서와클라이언트가동작하기때문클라이언트와통신을위한입출력스트림생성 BufferedReader in = new BufferedReader(new InputStreamReader(soc.getInputStream())); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(soc.getOutputStream())); 스트림을생성하여와데이터송수신 데이터의종류에따라바이트스트림또는문자스트림사용 채팅과같이문자열을송수신하는경우는문자스트림사용 효율적입출력을위하여버퍼스트림 (Buffered Stream) 사용 28
클라이언트프로그램 에데이터송신 String outmsg = in.readline(); out.write(" 클라이언트 > "+outmsg+"\n"); 스트림생성이후는데이터출력방법과동일콘솔에서입력받은문자열을로송신 flush() 메소드로스트림의모든데이터를로송신클라이언트의데이터수신 String inmsg = in.readline(); 예제실행 프로그램을먼저실행시켜소켓으로연결요청을모니터링하며대기 스트림생성이후는데이터입력방법과동일에서한행의문자열을보내올때까지기다림연결종료 데이터의송수신이끝나면소켓을닫아야함소켓을닫으면소켓의입출력스트림도같이닫힘 29 30 예제실행 클라이언트프로그램을실행하여와연결을설정 클라이언트 예제실행 클라이언트에서먼저시작하여번갈아가면서순서대로메시지를주고받도록한다. 클라이언트 31 32
예제실행 클라이언트에서 bye 를입력하여채팅종료 클라이언트 33