class InetAddress3{ public static void main(string[] args) throws Exception{ String url = null ; Scanner reader = new Scanner(System.in); System.out.p

Similar documents
Microsoft PowerPoint - Supplement-03-TCP Programming.ppt [호환 모드]

Microsoft PowerPoint - 03-TCP Programming.ppt

자바-11장N'1-502

Microsoft PowerPoint - 04-UDP Programming.ppt

13-Java Network Programming

<4D F736F F F696E74202D20B3D7C6AEBFF6C5A9C7C1B7CEB1D7B7A1B9D65F FBCD2C4CF5FC3A4C6C35FBFA1C4DA2E BC8A3C8A

<4D F736F F F696E74202D20C1A63235C0E520B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D628B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

학습목표 네트워크개요 TCP PORT URL/InetAddress Socket/TCP 을이용한네트워크 2

PowerPoint 프레젠테이션

PowerPoint Presentation

Microsoft PowerPoint - Lecture_Note_5.ppt [Compatibility Mode]

(Microsoft PowerPoint - AUTCHEYREGRG.ppt [\310\243\310\257 \270\360\265\345])

PowerPoint Presentation

The Pocket Guide to TCP/IP Sockets: C Version

rmi_박준용_final.PDF

Microsoft PowerPoint - [EEL2] Lab10.pptx

<4D F736F F F696E74202D E20B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D62E >

<4D F736F F F696E74202D20C1A63234C0E520C0D4C3E2B7C228B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint PythonGUI-socket

목차 INDEX JSON? - JSON 개요 - JSONObject - JSONArray 서울시공공데이터 API 살펴보기 - 요청인자살펴보기 - Result Code - 출력값 HttpClient - HttpHelper 클래스작성 - JSONParser 클래스작성 공공

Microsoft PowerPoint - java2-lecture7.ppt [호환 모드]

파일로출력하는작업순서 1. 파일을연다. 2. 파일로자료를쓴다. 3. 파일을닫는다. 파일입출력에사용되는클래스들. FileInputStream, FileOutputStream, FileReader, FileWriter 문자단위로입출력하기 사람이읽을수있는문자로만구성된파일을읽

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

제1장 Unix란 무엇인가?

파일로입출력하기II - 파일출력클래스중에는데이터를일정한형태로출력하는기능을가지고있다. - PrintWriter와 PrintStream을사용해서원하는형태로출력할수있다. - PrintStream은구버전으로가능하면 PrintWriter 클래스를사용한다. PrintWriter

Network Programming

12-file.key

16장

JAVA PROGRAMMING 실습 09. 예외처리

JMF3_심빈구.PDF

Microsoft PowerPoint - RMI.ppt

2009년 상반기 사업계획

PowerPoint Presentation

PowerPoint Presentation

PowerPoint 프레젠테이션

The Pocket Guide to TCP/IP Sockets: C Version

슬라이드 1

(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345])

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

PowerPoint Presentation

Cluster management software

PowerPoint 프레젠테이션

PowerPoint Presentation

The Pocket Guide to TCP/IP Sockets: C Version

JMF2_심빈구.PDF

PowerPoint 프레젠테이션

제11장 프로세스와 쓰레드

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

Microsoft PowerPoint - Java7.pptx

02 C h a p t e r Java

PowerPoint Presentation

PowerPoint 프레젠테이션

JAVA PROGRAMMING 실습 08.다형성

Network Programming

Java

스레드의우선순위 우선순위설정메소드 : void setpriority(int newpriority) newpriority 에설정할수있는등급 : 1( 가장낮은우선순위 ) 부터 10( 가장높은우선순위 ) 가장높은우선순위 : MAX_PRIORITY, 보통우선순위 : NORM_

The Pocket Guide to TCP/IP Sockets: C Version

Chap12

PowerPoint Presentation

Microsoft PowerPoint - 09-EDU-15-채팅 프로그래밍

Java ...

Microsoft PowerPoint - CSharp-10-예외처리

JAVA PROGRAMMING 실습 02. 표준 입출력

항상쌍 ( 키, 값 ) 으로만데이터를저장하는클래스 의최고조상 : Map - Map을조상으로하는클래스, HashTable, HashMap, LinkedHashMap, TreeMap 등은데이터를저장할때반드시 키 와 값 의쌍으로저장한다. - Map에저장되는 키 는중복되면안되

스레드를적용하지않은결과와스레드를적용한결과의비교 1) 두개의작업을스레드를사용하지않고수행한예 ) : 순차작업 class ThreadTest2 { System.out.print("-");// 화면에 - 를출력하는작업 System.out.print(" ");// 화면에 를출력

제11장 자바 입출력

쉽게 풀어쓴 C 프로그래밍

gnu-lee-oop-kor-lec06-3-chap7

PowerPoint Presentation

비긴쿡-자바 00앞부속

Cluster management software

gnu-lee-oop-kor-lec11-1-chap15

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

Spring Data JPA Many To Many 양방향 관계 예제

[ 프로젝트이름 ] : Project_Car [ 프로젝트를만든목적 ] : 임의의자동차판매소가있다고가정하고, 고객이원하는자동차의각부분을 Java 를이용하여객 체로생성하고, 그것을제어하는메소드를이용하여자동차객체를생성하는것이목표이다. [ 프로젝트패키지와클래스의내용설명 ] [

슬라이드 1

Connection 8 22 UniSQLConnection / / 9 3 UniSQL OID SET

Microsoft PowerPoint PythonGUI-network

07 자바의 다양한 클래스.key

Microsoft PowerPoint - CSharp-15-채팅

쉽게 풀어쓴 C 프로그래밊

Microsoft PowerPoint - 12 ¼ÒÄÏÀ» ÀÌ¿ëÇÑ Åë½Å 1.ppt

4장.문장

혼자서일을다하는 JSP. 이젠일을 Servlet 과나눠서한다. JSP와서블릿의표현적인차이 - JSP는 <html> 내에서자바를사용할수있는수단을제공한다. - 서블릿은자바내에서 <html> 을작성할수있는수단을제공한다. - JSP나서블릿으로만웹페이지를작성하면자바와다양한코드가

(Microsoft PowerPoint - Chapter17 RMI.ppt [\310\243\310\257 \270\360\265\345])

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

쉽게

歯JavaExceptionHandling.PDF

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

PowerPoint Presentation

제1장 자바 언어 소개

FileMaker ODBC and JDBC Guide

Microsoft Word - src.doc

Microsoft PowerPoint - AUTOMATING BESPOKE ATTACKS.pptx

2) 활동하기 활동개요 활동과정 [ 예제 10-1]main.xml 1 <LinearLayout xmlns:android=" 2 xmlns:tools="

슬라이드 1

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

歯NetworkKawuiBawuiBo.PDF

Transcription:

네트워크프로그램작성 -네트워크예제는새로운프로젝트를만든후에패키지르만들지않은상태에서작성한다. -프로그램의컴파일과실행은 명령프롬프트 에서한다. -자바파일의컴파일은 javac 파일이름.java" 와같이실행한다. -컴파일되어생성된클래스파일의실행은 java 파일이름 와같이실행한다. -소켓을이용한프로그램은항상 요청을받는역할 의프로그램과 요청을보내는역할 의프로그램이존재하므로, 두개이상의명령프롬프트창을생성해서작업한다. InetAddress 클래스와 URL 를사용한예제 ) class InetAddress1{ public static void main(string[] args) throws UnknownHostException{ InetAddress addr1 = InetAddress.getByName("www.naver.com"); InetAddress addr2 = InetAddress.getLocalHost(); System.out.println("============================================"); System.out.println( "addr1 = " + addr1.gethostaddress()); System.out.println( " 로컬주소 = " + addr2.gethostaddress()); System.out.println( " 로컬이름 = " + addr2.gethostname()); class InetAddress2{ public static void main(string[] args) throws Exception{ String url = null ; Scanner reader = new Scanner(System.in); System.out.print(" 웹사이트주소를입력하세요.>> "); url = reader.nextline(); InetAddress addr = InetAddress.getByName(url); System.out.println("============================================"); System.out.println( url +" 의 IP 번호 = " + addr.gethostaddress()); - 1 -

class InetAddress3{ public static void main(string[] args) throws Exception{ String url = null ; Scanner reader = new Scanner(System.in); System.out.print(" 웹사이트주소를입력하세요.>> "); url = reader.nextline(); InetAddress[] addr = InetAddress.getAllByName(url); System.out.println("============================================"); System.out.println(url + " 는 "+ addr.length + " 개의 IP주소를갖고있습니다."); for(int i = 0 ; i < addr.length ; i++){ System.out.println( (i+1)+" 번 IP 번호 = " + addr[i].gethostaddress()); class UrlExample{ public static void main(string[] args) throws Exception{ String url_str = null; Scanner reader = new Scanner(System.in); System.out.print(" URL 페이지입력 >> "); url_str = reader.readline().trim();//trim() : 쓸데없는공백제거메서드 URL url = new URL( url_str ); System.out.println(" 프로토콜 : " + url.getprotocol()); System.out.println(" 포트번호 : " + url.getport()); System.out.println(" 호스트 : " + url.gethost()); System.out.println("URL 내용 : " + url.getcontent()); System.out.println(" 파일경로 : " + url.getfile()); System.out.println("URL 전체 : " + url.toexternalform()); - 2 -

TCP 소켓프로그램 TCP 소켓은 ServerSocket 클래스와 Socket 클래스로구성된다. 통신은쌍방이존재해야의미가있는작업이므로, 한쪽이서버역할을하고다른쪽은클라이언트역할을한다. 쌍방이공통의포트번호를사용해야접속이이루어진다. Socket : 쌍방의접속을담당하며데이터송수신에사용되는 InputStream과 OutputStream 객체를가지고있다. ServerSocket : 지정된포트번호로입력되는요청이있는지대기한다. 입력된요청이감지되면 Socket 객체를생성해서쌍방간의통신이이루어지도록한다. 하나의포트에하나의 ServerSocket만연결할수있다. TCP 소켓사용방법 1. 클라이언트가 Socket을생성한다. 2. ServerSocket의 accept() 메소드가클라이언트의접속요청을확인한다. 3. 서버에 Socket이하나생성된다. 4. 새로생성된 Socket은클라이언트의 Socket과연결된다. ServerSocket(int port) ServerSocket 생성자지정된포트 (port) 번호로클라이언트의요청을받는 ServerSocket 객체를생성한다. 메소드클라이언트요청을받아들인다음에 Socket 객체를생성한 Socket accept() 후생성된 Socket 객체를리턴한다. void close() 서버소켓을닫는다. Socket 생성자 Socket(String host, int port) host : 접속할서버의 IP 주소 port : 접속에사용될포트번호 Socket(InetAddress addr, int port) addr : 접속할서버의 InetAddress 객체 메소드 InputStream getinputstream() 현재소켓에서사용할 InputStream 객체를리턴한다. OutputStream getoutputstream() 현재소켓에서사용할 OutputStream 객체를리턴한다. void close() 소켓을닫는다. InetAddress getinetaddress() 소켓에연결된원격컴퓨터의 InetAddress 객체를리턴한다. InetAddress getlocaladdress() 소켓에연결된지역컴퓨터의 InetAddress 객체를리턴한다. int getport() 소켓에연결된컴퓨터의포트번호를리턴한다. int getlocalport() 소켓에연결된지역컴퓨터의포트번호를리턴한다. - 3 -

소켓을이용한데이터송수신하기 : Server 쪽프로그램 ) import java.util.date; import java.text.simpledateformat; public class TcpIpServer { public static void main(string args[]) { ServerSocket serversocket = null; serversocket = new ServerSocket(7777);//7777번포트를사용하는서버소켓을생성 System.out.println(getTime()+" 서버가준비되었습니다."); catch(ioexception e) { e.printstacktrace(); while(true) { System.out.println(getTime()+" 연결요청을기다립니다."); // 서버소켓은클라이언트의연결요청이올때까지실행을멈추고계속기다린다. // 클라이언트로부터연결요청이오면통신할새로운소켓을생성한다. Socket socket = serversocket.accept(); System.out.println(getTime() + socket.getinetaddress() + " 로부터연결요청이들어왔습니다."); // 소켓의출력스트림을얻는다. OutputStream out = socket.getoutputstream(); DataOutputStream dos = new DataOutputStream(out); // 원격소켓 (remote socket) 에데이터를보낸다. //writeutf() 메소드를사용해서문자열을국제표준형태로 Stream에쓴다. dos.writeutf("[notice] Test Message1 from Server."); System.out.println(getTime()+" 데이터를전송했습니다."); dos.close();//stream을닫는다. socket.close();// 소켓을닫는다. catch (IOException e) { e.printstacktrace(); - 4 -

// main // while static String gettime() {// 현재시간을문자열로반환하는메소드 SimpleDateFormat f = new SimpleDateFormat("[hh:mm:ss]");// 시 : 분 : 초형태를의미 return f.format(new Date());// 날짜를위의형태로변환하여리턴 // class의끝 소켓을이용한데이터송수신하기 : Client 쪽프로그램 ) public class TcpIpClient { public static void main(string args[]) { String serverip = "127.0.0.1";// 본인컴퓨터의 IP 주소 System.out.println(" 서버에연결중입니다. 서버IP :" + serverip); Socket socket = new Socket(serverIp, 7777);// 소켓을생성하여연결을요청한다. // 소켓으로부터입력스트림을얻는다. InputStream in = socket.getinputstream(); DataInputStream dis = new DataInputStream(in); // 소켓에서받은데이터를출력한다. System.out.println(" 서버로부터받은메세지 :"+dis.readutf()); System.out.println(" 연결을종료합니다."); dis.close();//stream을닫는다. socket.close();// 소켓을닫는다. System.out.println(" 연결이종료되었습니다."); catch(connectexception ce) { ce.printstacktrace(); catch(ioexception ie) { ie.printstacktrace(); catch(exception e) { e.printstacktrace(); // main - 5 -

타임서버프로그램 ) import java.util.*; class TimeServer { public static void main(string[] args){ int port = 7000;// 통신연결에사용할포트번호. 임의로설정한다. try{ ServerSocket ss = new ServerSocket(port);// 서버소켓생성 //ss.setsotimeout(5 * 1000);//5초동안연결요청이없으면자동을종료한다. while(true){ Socket client = ss.accept();// 클라이언트로부터접속요청수락 OutputStream os = client.getoutputstream(); // 출력데이터를위해서 OutputStream 객체를생성 ObjectOutputStream oos = new ObjectOutputStream(os); // 날짜객체출력을위해서 ObjectOutputStream 생성 oos.writeobject( new Date() );// 날짜객체를소켓에씀 oos.flush();//stream을클라이언트로전송 oos.close();//stream 객체를닫는다. client.close();// 소켓을닫는다. catch(exception e){ System.out.println( e.getmessage()); - 6 -

타임클라이언트프로그램 ) import java.util.*; class TimeClient { public static void main(string[] args){ String server_ip; Date date = null; int port = 7000;// 서버소켓의포트번호와일치해야한다. try{ BufferedReader read = new BufferedReader(new InputStreamReader(System.in)); // 화면에서데이터를읽어오기위해서 BufferedReader 객체를생성 //Scanner 클래스를사용하지않고도, 화면에서데이터를읽을수있다. System.out.println(" 타임서버시간받아오기..."); System.out.print(" 타임서버아이피입력 : "); server_ip = read.readline();// 접속할서버소켓의주소를읽는다. Socket client = new Socket(server_ip, port);// 서버소켓과접속한소켓생성 InputStream is = client.getinputstream();// 연결된소켓으로부터 Stream을생성 ObjectInputStream ois = new ObjectInputStream(is);//Stream으로부터객체 Stream 생성 date = (Date)ois.readObject();// 객체스트림으로부터서버소켓이전송한날짜객체를읽는다. System.out.println(" 현재시간 :" + date);// 읽은날짜객체를화면에출력 ois.close();// 사용한 Stream을닫는다. client.close();// 소켓을닫는다. catch(exception e){ System.out.println( e.getmessage()); - 7 -

에코서버프로그램 ) 이프로그램은클라이언트에서전송한메시지가서버로갔다가다시클라이언트로되돌아온다. import java.util.*; class EchoServer { public static void main(string[] args){ int port = 5001;// 통신에사용할포트번호 try{ ServerSocket ss = new ServerSocket(port); while(true){ Socket client = ss.accept(); InputStream is = client.getinputstream(); ObjectInputStream ois = new ObjectInputStream(is); // 클라이언트에서송신한메시지를읽을 Stream을만든다. OutputStream os = client.getoutputstream(); ObjectOutputStream oos = new ObjectOutputStream(os); // 클라이언트로송신할 Stream 을만든다. oos.writeobject(ois.readobject()); // 클라이언트에서수신한메시지를읽자마자바로, 다시클라이언트로송신한다. oos.flush();// 클라이언트로전송 ois.close(); oos.close(); client.close(); catch(exception e){ System.out.println( e.getmessage()); - 8 -

에코클라이언트프로그램 ) 이프로그램은클라이언트에서전송한메시지가서버로갔다가다시클라이언트로되돌아온다. import java.util.*; class EchoClient { public static void main(string[] args){ String server_ip, send, receive; long start, end; int port = 5001; try{ BufferedReader read = new BufferedReader(new InputStreamReader(System.in)); System.out.println(" ***** 에코서버 ***** "); System.out.print(" 에코서버아이피입력 : "); server_ip = read.readline();// 접속할서버의주소를화면으로부터읽는다. System.out.println(" 에코문자열입력 : "); send = read.readline();// 전송할메시지를화면으로부터읽는다. Socket client = new Socket(server_ip, port);// 서버와접속할소켓생성 start = System.currentTimeMillis();// 전송시작시간 OutputStream os = client.getoutputstream(); ObjectOutputStream oos = new ObjectOutputStream(os); oos.writeobject(send);// 서버로전송할메시지를 Stream에쓴다. oos.flush();//stream을서버로전송한다. InputStream is = client.getinputstream(); ObjectInputStream ois = new ObjectInputStream(is);// 서버로부터수신할 Stream 생성 receive = (String)ois.readObject();//Stream 을부터메시지를문자열형태로읽는다. end = System.currentTimeMillis(); // 전송완료시간 System.out.println(" 에코반응시간 : " +(end-start)+" 밀리초 " ); System.out.println(" 수신에코문자열 :" + receive); ois.close();// 사용한 Stream 을닫는다. oos.close();// 사용한 Stream 을닫는다. client.close();// 사용한소켓을닫는다. - 9 -

catch(exception e) { System.out.println( e.getmessage() ); 간단한채팅서버프로그램 ) 이프로그램은클라이언트에서전송한메시지가서버의화면에나타나는프로그램이다. class ChatServer { public static void main(string[] args){ int port = 5005;// 채팅서버포트번호 try{ ServerSocket ss = new ServerSocket(port); while( true ){ Socket client = ss.accept();// 클라이언트와접속성공후소켓생성 InputStream is = client.getinputstream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); // 수신된메시지를읽을 Stream 생성 PrintStream ps = new PrintStream(System.out); // 화면출력에사용할 Stream 생성 ps.print( client.getinetaddress().gethostaddress() ); // 클라이언트의주소를가지고있는 InetAddress 객체를얻어와서, //InetAddress 객체로부터 IP 주소를불러와서화면에출력한다. ps.print(" : 에서수신메시지 >>" + br.readline()); br.close(); ps.close(); client.close(); catch(exception e){ System.out.println(e.getMessage()); - 10 -

간단한채팅클라이언트프로그램 ) 이프로그램은클라이언트에서전송한메시지가서버의화면에나타나는프로그램이다. class ChatClient { public static void main(string [] args){ int port = 5005; String server_ip, str; try{ PrintStream ps = new PrintStream(System.out); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); ps.print(" 접속할서버아이피 : >> "); server_ip = br.readline();// 화면에서서버의주소를입력한다. ps.print(" 전송할메시지 : >> "); str = br.readline();// 서버로전송할메시지를입력한다. Socket client = new Socket( server_ip, port );// 채팅서버와접속하여 Socket 생성 OutputStream os = client.getoutputstream(); BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(os)); bw.write(str, 0, str.length());// 화면에서입력한메시지를 Stream에쓴다. bw.flush();//stream을서버로전송한다. bw.close();// 서버로메시지전송에사용한 Stream을닫는다. client.close();// 소켓을닫는다. ps.print( server_ip + " 에메시지전송성공!"); ps.close();// 화면으로부터메시지를입력받는데사용한 Stream을닫는다. catch(exception e){ System.out.println( e.getmessage()); - 11 -

1 : 1 채팅소켓프로그램 -여러사람들이서로채팅을하기위해서는하나의서버와하나의클라이언트만있어서는이루어질수없다. -메시지를주고받는다는것은, 메시지를보내는역할 ( 클라이언트 ) 을한후에는메시지를받는역할 ( 서버 ) 을해야한다는것을의미한다. -하나의컴퓨터에서클라이언트와서버의역할을동시에해야동시에메시지를주고받는채팅이가능하다. -서버의역할과클라이언트의역할을동시에할수있는방법은스레드 (thread) 를사용하는방법이다. -채팅하려는쌍방이각각서버역할의스레드와클라이언트역할의스레드를만들어서동시에실행시키면, 서로메시지를교환할수있는 1:1 채팅이이루어진다. -1:1 채팅소켓프로그램의구성은 1 서버역할의프로그램클라이언트와접속이이루어진후에는 3과 4의스레드를시작한다. 2 클라이언트역할의프로그램서버와접속이이루어진후에는 3과 4의스레드를시작한다. 3 메시지를보내는역할을하는스레드 4 메시지를수신하는역할을하는스레드 - 12 -

1 : 1 채팅서버프로그램 ) import java.util.scanner; public class OnetoOneServer { public static void main(string args[]) { ServerSocket serversocket = null; Socket socket = null; // 채팅에사용할포트번호를 7777 번으로설정함. 변경해도된다. serversocket = new ServerSocket(7777); System.out.println(" 서버가준비되었습니다."); socket = serversocket.accept();// 클라이언트와소켓연결 Sender sender = new Sender(socket);// 메시지전송에사용할스레드생성 Receiver receiver = new Receiver(socket);// 메시지수신에사용할스레드생성 sender.start();// 메시지전송목적의스레드시작 receiver.start();// 메시지수신목적의스레드시작 catch (Exception e) { e.printstacktrace(); // main // class - 13 -

class Sender extends Thread { Socket socket; DataOutputStream out; String name; Sender(Socket socket) {//Sender 스레드의생성자. 스레드를만들때소켓이필요하다. this.socket = socket; out = new DataOutputStream(socket.getOutputStream()); // 소켓으로부터메시지전송에사용할 Stream을생성한다. name = "["+socket.getinetaddress()+":"+socket.getport()+"]"; catch(exception e) { public void run() { Scanner scanner = new Scanner(System.in); while(out!=null) { out.writeutf(name+scanner.nextline()); // 화면에서입력한메시지를닉네임과함께전송한다. catch(ioexception e) { // run() - 14 -

class Receiver extends Thread { Socket socket; DataInputStream in; Receiver(Socket socket) {//Receiver 스레드의생성자. 스레드를만들때소켓이필요하다. this.socket = socket; in = new DataInputStream(socket.getInputStream()); // 소켓으로부터메시지수신에사용할 Stream을생성한다. catch(ioexception e) { public void run() { while(in!=null) { System.out.println(in.readUTF()); //Stream으로부터메시지를읽어서화면에그대로출력한다. catch(ioexception e) { // run - 15 -

1 : 1 채팅클라이언트프로그램 ) public class OnetoOneClient { public static void main(string args[]) { String serverip = "127.0.0.1";// 접속할채팅서버의 IP 주소 // 본인의컴퓨터에서채팅서버와채팅클라이언트역할을수행하기위해 127.0.0.1로설정 // 다른사람과채팅하기위해서는이주소를상대방컴퓨터의 IP 주소로변경한다. Socket socket = new Socket(serverIp, 7777); // 채팅에사용할서버의포트번호 (7777) 와일치시킨다. System.out.println(" 서버에연결되었습니다."); Sender sender = new Sender(socket); // 서버와접속한후메시지송신역할의스레드생성 Receiver receiver = new Receiver(socket); // 서버와접속한후메시지수신역할의스레드생성 sender.start();// 스레드시작 receiver.start();// 스레드시작 catch(connectexception ce) { ce.printstacktrace(); catch(ioexception ie) { ie.printstacktrace(); catch(exception e) { e.printstacktrace(); // main // class - 16 -

멀티채팅프로그램작성 -멀티채팅은하나의채팅서버에수명의클라이언트가접속해서의견을교환한다. -하나의클라이언트에서서버로전송한메시지는그서버에접속한모든클라이언트창에출력된다. -서버는서버에접속한모든클라이언트의대화명과송수신에사용하는 Stream을저장해야한다. 왜냐하면, 서버에접속한모든클라이언트들에게클라이언트로부터전송된메시지를모두보내야하기때문이다. 클라이언트 1 대화명 : aha 안녕하세요 [aha] 안녕하세요 채팅서버 클라이언트 2 대화명 : yaho [aha] 안녕하세요 클라이언트 3 대화명 : yo [aha] 안녕하세요 - 채팅서버에접속한모든클라이언트의정보는 Map 을사용해서 대화명 을키값으로하고, 메시지송신에사용하는 Stream 을값으로저장한다. - 그러므로, 하나의클라이언트에서수신된메시지를 Map 에저장된모든클라이언트로전송할수있다. - 17 -

N : N 멀티채팅서버프로그램 ) import java.util.*; public class TcpIpMultichatServer { HashMap clients;// 모든클라이언트의정보를보관할 HashMap 정의 TcpIpMultichatServer() {// 생성자 clients = new HashMap();//HashMap을생성한다. Collections.synchronizedMap(clients);// 위에서생성한 HashMap에동기화를설정한다. // 즉, 많은클라이언트들의정보가하나의 HashMap에저장되므로, // 하나의클라이언트가 HashMap에작업을하는동안은다른클라이언트가 MashMap에 // 접근해서는안된다. 그러므로, 동기화를한다. // 컬렉션프레임워크에동기화를하는방법은 Collections 클래스를이용한다. public void start() {// 서버가작업을하도록하는메서드 ServerSocket serversocket = null; Socket socket = null; serversocket = new ServerSocket(7777);//7777 번포트를멀티채팅에사용한다. System.out.println(" 서버가시작되었습니다."); while(true) { socket = serversocket.accept(); System.out.println("["+socket.getInetAddress() + ":"+ socket.getport()+"]"+" 에서접속하였습니다."); ServerReceiver thread = new ServerReceiver(socket); thread.start();// 메시지수신용스레드를시작 catch(exception e) { e.printstacktrace(); // start() - 18 -

void sendtoall(string msg) {// 서버에접속한모든클라이언트에메시지를전송하는메소드 Iterator it = clients.keyset().iterator(); // 현재서버에접속된모든클라이언트에메시지를전달하기위해서는반복작업이필요하다. // 컬렉션프레임워크에서반복작업을하려면, Iterator객체를이용해야한다. // 그래서, HashMap에저장되어있는키값, 즉, 대화명에대한 Iterator객체를얻어온다. while(it.hasnext()) {// 모든닉네임에메시지를전송한다. DataOutputStream out = (DataOutputStream)clients.get(it.next()); out.writeutf(msg); catch(ioexception e){ // while // sendtoall public static void main(string args[]) { new TcpIpMultichatServer().start(); class ServerReceiver extends Thread {// 클라이언트로부터전송된메시지를수신하는스레드 Socket socket; DataInputStream in; DataOutputStream out; ServerReceiver(Socket socket) { this.socket = socket; in = new DataInputStream(socket.getInputStream()); // 채팅서버로수신되는메시지처리를위한 Stream out = new DataOutputStream(socket.getOutputStream()); // 채팅서버에서클라이언트로메시지를송신하기위한 Stream catch(ioexception e) { public void run() { String name = "";// 대화명을저장할변수 name = in.readutf(); sendtoall("#"+name+" 님이들어오셨습니다."); - 19 -

clients.put(name, out);//hashmap에서버에접속한클라이언트를저장한다. System.out.println(" 현재서버접속자수는 " + clients.size() + " 입니다."); while(in!=null) { sendtoall(in.readutf()); catch(ioexception e) { // ignore finally { sendtoall("#"+name+" 님이나가셨습니다."); clients.remove(name); System.out.println("["+socket.getInetAddress()+":"+socket.getPort()+"]"+" 에서접속을종료하였습니다."); System.out.println(" 현재서버접속자수는 "+ clients.size()+" 입니다."); // try // run // ReceiverThread // class - 20 -

N : N 멀티채팅클라이언트프로그램 ) import java.util.scanner; public class TcpIpMultichatClient { public static void main(string args[]) { if(args.length!=1) {// 채팅을하기위해서는반드시대화명 ( 닉네임 ) 이필요하다. System.out.println("USAGE: java TcpIpMultichatClient 대화명 "); System.exit(0);// 대화명을입력하지않은채프로그램을실행하면종료됨. String serverip = "127.0.0.1";// 채팅서버의 IP 주소 // 현재는 127.0.0.1로본인의컴퓨터로설정되어있지만, 실제로채팅시에는 // 실제채팅서버의 IP 주소로변경한다. Socket socket = new Socket(serverIp, 7777); System.out.println(" 서버에연결되었습니다."); Thread sender = new Thread(new ClientSender(socket, args[0])); // 메시지송신용스레드생성 Thread receiver = new Thread(new ClientReceiver(socket)); // 서버에서송신하는메시지수신을위한메시지수신용스레드생성. sender.start();// 스레드시작 receiver.start();// 스레드시작 catch(connectexception ce) { ce.printstacktrace(); catch(exception e) { // main static class ClientSender extends Thread {// 메시지를송신하는역할의스레드 Socket socket; DataOutputStream out; String name;// 대화명을저장할변수 ClientSender(Socket socket, String name) { this.socket = socket; - 21 -

out = new DataOutputStream(socket.getOutputStream()); this.name = name; catch(exception e) { public void run() { Scanner scanner = new Scanner(System.in); if(out!=null) { out.writeutf(name);//stream이비어있으면대화명만전송 while(out!=null) { out.writeutf("["+name+"]"+scanner.nextline()); //Stream에메시지가있으면대화명과화면에서입력한메시지를송신 // run() catch(ioexception e) { static class ClientReceiver extends Thread {// 메시지를수신하는역할의스레드 Socket socket; DataInputStream in; ClientReceiver(Socket socket) { this.socket = socket; in = new DataInputStream(socket.getInputStream()); catch(ioexception e) { // class public void run() { while(in!=null) { System.out.println(in.readUTF()); catch(ioexception e) { // run - 22 -

UDP 소켓프로그램 TCP 소켓은데이터를 100% 안전하게전송할수있다. 때문에높은신뢰성이요구되는프로그램에적합하다. 그러나, 신뢰성이요구되지않거나대용량의데이터를전송하는경우에는네트워크에부하를주는 TCP 소켓이적당하지않을수있다. 이런경우에사용하는것이 UDP 소켓이다. TCP 소켓에비해신뢰성은떨어지지만네트워크에부담은덜준다. 자바는 UDP 소켓을위해 DatagramPacket과 DatagramSocket 클래스를사용한다. UDP 방식을이용한데이터의전송방법 1 데이터를수신할 DatagramSocket을생성 2 데이터를전송할 DatagramSocket을생성 3 DatagramPacket을생성해서 DatagramSocket의 send() 메소드매개변수로넣어서버측의 DatagramSocket에데이터를전송한다. 4 데이터의수신은 DatagramSocket의 receive() 메소드가처리한다. UDP 소켓은 TCP 소켓처럼서버와클라이언트가명확하게구분되지않는다. 즉, 전송할데이터가있으면수신측의준비여부와관계없이전송하기때문이다. - 23 -

UDP 채팅서버프로그램 ) class UDPChatServer { public static void main(string[] args){ int port = 5005;// 채팅서버포트 final int BUFFER = 50; byte buffer[] = new byte[buffer]; String message = null; PrintStream ps = new PrintStream(System.out); try{ DatagramSocket ds = new DatagramSocket(port);//UDP 수신용소켓 while( true ){ DatagramPacket dp = new DatagramPacket(buffer, buffer.length); ds.receive(dp);//udp 수신용소켓에서 UDP 메시지를수신한다. message = new String( dp.getdata() );// 수신한 UDP 메시지를문자열로변환 ps.print(" 수신메시지 >>" + message);// 변환한메시지를화면에출력 catch(exception e){ System.out.println(e.getMessage()); ps.close(); - 24 -

UDP 채팅클라이언트프로그램 ) class UDPChatClient { public static void main(string[] args){ int port = 5005; String server_ip, str; try{ PrintStream ps = new PrintStream(System.out); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); ps.print(" 접속할서버아이피 : >> "); server_ip = br.readline(); ps.print(" 전송할메시지 : >> "); str = br.readline(); DatagramSocket ds = new DatagramSocket(); InetAddress addr = InetAddress.getByName( server_ip ); byte buffer[] = str.getbytes(); DatagramPacket dp = new DatagramPacket(buffer, buffer.length, addr, port); ds.send(dp);// 송신할메시지를 UDP 패킷을 UDP 소켓을통해서송신한다. ps.print( server_ip + " 에메시지전송성공!"); ps.close(); catch(exception e){ System.out.println( e.getmessage()); - 25 -