데이터 접근 / Parsing / JSON Parsing / Socket

준동이·2023년 4월 14일
0

데이터 접근

외부

프로토콜
아이피
포트

1. 웹서버

html...기타 자료정보 / 공개, 공식 제공자료는 아님
html(image) - 크롤링, 크스래핑 => 가공

가공
1. String, StringBuffer, StringBuilder
2. Regular Expression(POSIX) - 정규 표현식
3. Library(API) - JSoup

OpenAPI - 공식 제공 : 회원가입(API key)

제공되는 형태
1. text

  • CSV

  • XML - 구조적인 데이터 관리를 위한 텍스트 문서
    공유 가능한 방식으로 데이터를 정의하고 저장할 수 있다.
    XML은 웹 사이트, 데이터베이스 및 타사 애플리케이션과 같은 컴퓨터 시스템 간의 정보 교환을 지원.
    https://aws.amazon.com/ko/what-is/xml/ 참고

  • JSON - Javascript Object Notation
    어떤 언어에서든 데이터 구조와 실제 데이터를 다른 언어 및 플랫폼에서 해석 가능한 형식으로 전송할 수 있게 해주는 데이터 교환 포맷
    {} / []
    jsonlint.com

  • 공통적으로 분석하는대에 있어서 String클래스의 메서드를 사용하는것은 가장 마지막(아무것도 안되면 String쓰면 됨)

  • 공식 라이브러리 Library(API) 상수

  1. 보안상 library

Parsing - 문서를 분석

parsing : 구문 분석이라고도 함
문장이 이루고 있는 구성 성분을 분해하고 분해된 성분의 위계 관계를 분석하여 구조를 결정하는것.
즉 데이터를 분해 분석하여 원하는 형태로 조립하고 다시 빼내는 프로그램
웹상에서 주어진 정보를 내가 원하는 형태로 가공하여 서버에서 불러들이는 것.

XML parsing / JSON parsing이 있다.

영화 순위와 이름 출력

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class ParsingEx01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 문서를 분석 - Parsing
		BufferedReader br = null;

		try {
			// XML 데이터 읽어오기
			URLConnection conn = new URL(
					"https://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchWeeklyBoxOfficeList.xml?key=f5eef3421c602c6cb7ea224104795888&targetDt=20230409")
					.openConnection();
			br = new BufferedReader(new InputStreamReader(conn.getInputStream()));

			// 순위, 영화명 list로 뽑아서 보기
			String line = br.readLine();

			// 그냥 출력하면 한줄로 출력이 된다. 자체에 \n이 적용돼있지않기때문.
//			System.out.println(line);

			// 개행문자가 적용되어있지 않아서 직접 '\n'을 넣어줌
			line = line.replaceAll("><", ">\n<");
//			System.out.println(line);

			String[] lines = line.split("\n");
			
			for(String data : lines) {
            	// startsWith() : 특정 문자로 시작
				if(data.trim().startsWith("<rank>")) {
					System.out.println(data.trim()
							.replaceAll("<rank>", "")
							.replaceAll("</rank>", ""));
				}
				
				if(data.trim().startsWith("<movieNm>")) {
					System.out.println(data.trim()
							.replaceAll("<movieNm>", "")
							.replaceAll("</movieNm>", ""));
				}
			}
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			System.out.println("[에러] : " + e.getMessage());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("[에러] : " + e.getMessage());
		} finally {
			if (br != null)
				try {
					br.close();
				} catch (IOException e) {
				}
		}
	}

}



JSoup으로 출력

밑의 코드중 헷결렸던 코드 설명.

/* HTML을 읽어온 String을 Jsoup으로 변환시킨 것.
변환시키는 이유는 URL로 부터 웹 페이지를 앍어와서 알아서 DOM 객체로 변환해 주는
"Jsoup.parse(String url, int timeoutMillisecons)" api가 있는데,
Jsoup은 네트워크 라이브러리는 아니여서 그 api는 추천하지 않고,
네트워크 전용 라이브러리로 HTML을 읽어온 다음, 읽어온 String을 Jsoup으로 
변환해 주는 방법을 추천한다.
방법 :  
    String html = ...(html문서)
    Document doc = Jsoup.parse(html)
*/

String data = br.readLine();

// JSON.parse() 메서드는 JSON 문자열의 구문을 분석하고, 그 결과에서 JavaScript 값이나 객체를 생성.
Document doc = Jsoup.parse(data);
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class ParsingEx02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 문서를 분석 - Parsing
		BufferedReader br = null;

		try {
			// XML 데이터 읽어오기
			URLConnection conn = new URL(
					"https://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchWeeklyBoxOfficeList.xml?key=f5eef3421c602c6cb7ea224104795888&targetDt=20230409")
					.openConnection();
			br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
			
            // html을 읽어온 것을 data변수에 저장.
			String data = br.readLine();
			
            // HTML을 읽어왔다면 jsoup document 객체로 변환시키는 방법
          	// HTML을 읽어온 String을 Jsoup으로 변환.
            // parse()는 구문 분석을 해준다.
			Document doc = Jsoup.parse(data);
            
            // 자동적으로 태그들을 나눠준다.
			// System.out.println(doc);
			
			// rank 태그만 뽑아준다.
			Elements rankTags = doc.getElementsByTag("rank");
			// System.out.println(rankTags);
			
			Elements nameTags = doc.getElementsByTag("movieNm");
			// System.out.println(nameTags.text());
            
			// 순위만 출력
			for(int i=0; i<rankTags.size(); i++) {
				Element rankTag = rankTags.get(i);
				System.out.println(rankTag.text());
				
				Element nameTag = nameTags.get(i);
				System.out.println(nameTag.text());
			}

		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			System.out.println("[에러] : " + e.getMessage());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("[에러] : " + e.getMessage());
		} finally {if (br != null)try {br.close();} catch (IOException e) {}
		}
	}

}



영화 상세정보에서 영화 고유번호 영화제목 배우 목록을 출력

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class MovieEx01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BufferedReader br = null;

		String data;
		try {
			URLConnection conn = new URL(
					"http://www.kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieInfo.xml?key=f5eef3421c602c6cb7ea224104795888&movieCd=20124079")
					.openConnection();
			br = new BufferedReader(new InputStreamReader(conn.getInputStream()));

			data = br.readLine();

			Document doc = Jsoup.parse(data);
//			System.out.println(doc);

			Elements movieCdTags = doc.getElementsByTag("movieCd");
			System.out.println("영화 고유 번호 : " + movieCdTags.text());

			Elements nameTags = doc.getElementsByTag("movieNm");
			System.out.println("영화 제목 : " + nameTags.text());

			Elements actorTags = doc.getElementsByTag("actor");
//			System.out.println(actorTags.text());

			Elements peopleTags = doc.getElementsByTag("peopleNm");
//			System.out.println(peopleTags.text());
			
			System.out.println("배우 이름");
			for (int i = 0; i < actorTags.size(); i++) {
				if(actorTags != null) {
					Element peopleTag = peopleTags.get(i);
					System.out.println(peopleTag.text());
				}
			}
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}



JSON Parsing

JSON은 네트워크를 통해 데이터를 주고받는 데 자주 사용되는 경량의 데이터 형식.
JSON은 name - value 형태의 쌍으로 이루어져있다. ( :(콜론)으로 이어진다 "name" : value)
name인 애들은 무조건 String이기때문에 반드시 큰따옴표로 묶어줘야한다. (value도 String이면 "" 해줘야함)

{ } 시작하면 객체가 나온다라는 의미. (name - value의 쌍 집합)
[ ]는 배열이 나온다는 의미

왜 파싱할까 ?
JSON 형태로 온 데이터들을 뽑아내는 느낌이다.
데이터들을 이용할 수 없는 형태이기때문에 데이터를 이용할 수 있게 데이터를 뽑는 것.

JSONObject = JSON Object를 새로 만드는 역할.
JSONParser = String 객체를 JSON객체로 변환할 때 사용.
JSON.parse() 메서드는 JSON 문자열의 구문을 분석하고, 그 결과에서 JavaScript 값이나 객체를 생성.
JSONArray = JSONArray는 JSON Object를 배열 형태를 나타낼 때 사용.

https://zeddios.tistory.com/90 < - JSON Parsing 설명



JSON문서 가져오기 - 라이브러리 사용으로 다른 형식으로 가져오기

json.org <- 참고

문자열 배열의 요소를 출력

import org.json.simple.JSONArray;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JSonEx01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// Json 데이터 : {}는 Object / []는 Array
		String strJson = "[8, 9, 6, 2, 9]"; // 배열 형태의 문자열
		
        // JSONParser객체 생성 / String 객체를 JSON객체로 변환할 때 사용.
		JSONParser parser = new JSONParser();
		
		try {
			// strJson이 배열이라 배열 형태를 띈다.
            // JSONParser를 JSONArray로 형변환 하여 배열 형태로 만든다.
			JSONArray array = (JSONArray)parser.parse(strJson);
			System.out.println(array);
            
            // 배열 형태로 됐기 때문에 사이즈는 요소가 5개여서 5로 출력된다.
			System.out.println(array.size());
			
			for(int i=0; i<array.size(); i++) {
				// Json의 기본 자료형은 정수형 long
				long data = (Long)array.get(i);
				System.out.println(data);
			}
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}



문자열 배열 안의 요소를 문자열로 취급하여 뽑기

import org.json.simple.JSONArray;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JSonEx02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 문자열 배열 안의 요소를 문자열로 취급하는데 ""는 사용이 되지 않아서 \"이런식으로 "를 나타내야한다.
		String strJson = "[\"8\", \"9\", \"6\", \"2\", \"9\"]"; 
		
		JSONParser parser = new JSONParser();
		
		try {
			// strJson이 배열이라 배열 형태를 띈다.
			JSONArray array = (JSONArray)parser.parse(strJson);
			System.out.println(array);
			System.out.println(array.size());
			System.out.println();
			
			for(int i=0; i<array.size(); i++) {
				// 문자열 배열 안의 문자열 요소를 출력하기위해 String으로 형변환
				String data = (String)array.get(i);
				System.out.println(data);
			}
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}



배열이 아닌 객체로 가져오기

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JSonEx03 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 객체로 : {}
		String strJson = "{\"data1\" : \"value1\", \"data2\" : \"value2\"}";
		
		JSONParser parser = new JSONParser();
		
		try {
			// 객체라서 Object로 반환이 돼야한다.
			JSONObject obj = (JSONObject)parser.parse(strJson);
			
			// 문자열로 뽑기 / 직접적으로 들어간다. data1이 들어가서 value1 출력
			String data1 = (String)obj.get("data1");
			System.out.println(data1);
			
			String data2 = (String)obj.get("data2");
			System.out.println(data2);
			
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}



객체형식 안에 배열값 뽑기

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JSonEx04 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 객체형식, 그 안에 배열도 넣을 수 있음. ""는 안먹어서 \"로 "살려저야한다.
		String strJson = "{\"data1\" : [1, 2, 3, 4], \"data2\" : [\"10\", \"20\", \"30\", \"40\"]}";
		
		JSONParser parser = new JSONParser();
		
		try {
			// 객체라서 Object로 반환이 돼야한다.
			JSONObject obj = (JSONObject)parser.parse(strJson);
			
			// 리턴형은 배열이여서 JSONArray로 해줘야 한다.
			JSONArray arr1 = (JSONArray)obj.get("data1");
			
			// 데이터 가져오기
			System.out.println(arr1);
			
			JSONArray arr2 = (JSONArray)obj.get("data2");
			
			System.out.println(arr2);
			
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}



배열 안에 객체가 여러개 있는 구조

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JSonEx05 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 객체형식, 그 안에 배열도 넣을 수 있음. ""는 안먹어서 \"로 "살려저야한다.
		String strJson = "[ { \"name\" : \"홍길동\", \"city\" : \"서울\" }, "
				+ "{ \"name\" : \"박문수\", \"city\" : \"경기\" } ]";

		JSONParser parser = new JSONParser();

		try {
			JSONArray arr = (JSONArray) parser.parse(strJson);

			for(int i=0; i<arr.size(); i++) {
				JSONObject object = (JSONObject)arr.get(i);
				
				String name = (String)object.get("name");
				System.out.println(name);
				
				String city = (String)object.get("city");
				System.out.println(city);
			}

		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}



문제

영화 순위, 번호, 제목 출력

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class ParsingEx03 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BufferedReader br = null;
		
		try {
			URLConnection conn = new URL( "http://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchWeeklyBoxOfficeList.json?key=f5eef3421c602c6cb7ea224104795888&targetDt=20230409" ).openConnection();
			br = new BufferedReader( new InputStreamReader( conn.getInputStream() ) );
				
			String line = br.readLine();
			
            // JSON 객체 생성
			JSONParser parser = new JSONParser();
			
			// parse()메서드로 line을 구문분석하고 JSONObject로 형변환한 것을 root에 저장
			JSONObject root = (JSONObject)parser.parse(line);
			
			/*
           JSONObject boxOfficeResult 변수에 JSONObject로 형변환 한 
           root의 객체{} boxOfficeResult의 value값을 넣어줌.
            */
			JSONObject boxOfficeResult = (JSONObject)root.get("boxOfficeResult");
			
			/*
            JSONArray weeklyBoxOfficeLists변수에 weeklyBoxOfficeList의 value(여기선 배열)를 뽑기위해
            JSONArray로 형변환 후 객체{}의 boxOfficeResult의 value값인 weeklyBoxOfficeList의 value값 넣음
            (weeklyBoxOfficeList도 객체{}형식이여서 value값이 존재.)
            */
			JSONArray weeklyBoxOfficeLists = (JSONArray)boxOfficeResult.get("weeklyBoxOfficeList");
			
			weeklyBoxOfficeList의 value[] 배열의 길이만큼 반복 
			for( int i=0 ; i<weeklyBoxOfficeLists.size() ; i++ ) {
            
				JSONObject weeklyBoxOffice = (JSONObject)weeklyBoxOfficeLists.get( i );
				System.out.printf( "%s\t%s\t%s%n",
                weeklyBoxOffice.get( "rank" ), weeklyBoxOffice.get( "movieCd" ), weeklyBoxOffice.get( "movieNm" ) );
                
			}
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			System.out.println( "[에러] " + e.getMessage() );
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println( "[에러] " + e.getMessage() );
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			System.out.println( "[에러] " + e.getMessage() );
		} finally {
			if( br != null ) try { br.close(); } catch ( IOException e ) {}
		}

	}
}



데이터를 주는쪽을 만들기
공개

Socket

ServerSocket - 제공자용 소켓 / 서버
1-1. 전송규약 중요
1-2. 몇번 포트로 열지

Socket - ServerSocket에 연결 / 접근 / 클라이언트

두 개를 한 번에 처리하지 못해서 두 개의 컴퓨터를 사용하거나, 하나는 이클립스 하나는 프롬프트에서 실행 등 프로그램 2 개로 실행하기도 함

가장 많이 쓰는 전송규약

TCP (Transmission Control Protocol) - 전화같은 상호동작 / 확인과 응답이 제일 중요 / 속도가 좀 느림
밑에 Http가 있음
UDP (User Diagram Protocol) - 방송 / 상대가 받았는지 확인하지 않음 (그냥 뿌리기만 해서)



소켓 서버(Server)와 클라이언트(Client)

소켓통신에는 서버와 클라이언트가 존재
서버(Server) - 데이터를 제공하는 쪽 / 서비스 제공
클라이언트(Client) - 데이터를 요청하여 제공받는 쪽 / 서비스 사용



서버와 클라이언트 통신과정


1.서버 프로그램에서는 서버소켓을 사용하여 서버 컴퓨터의 특정 포트에서 클라이언트의 연결요청을 처리할 준비를 함.

2.클라이언트 프로그램은 접속할 서버의 IP주소와 포트 정보를 가지고 소켓을 생성하여 서버에 연결 요청

3.서버소켓은 클라이언트의 연결요청을 받으면 서버에 새로운 소켓을 생성하여 클라이언트의 소켓과 연결되도록 한다.

4.클라이언트의 소켓과 새로 생성된 서버의 소켓은 서버소켓과 관계없이 일대일 통신을 한다.

정리

쉽게말해 서버와 클라이언트는 각각 소켓을 생성, 서버는 주소를 할당하고 클라이언트가 연결될 때까지 대기.

클라이언트가 연결 요청을 보내면, 기다리던 서버는 연결요청 수락 -> 서버와 클라이언트 데이터 주고받음.

서로 필요한 서비스 끝나면 연결 종료.



서버 생성

package pack1;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServerEx01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ServerSocket serverSocket = null;
		Socket socket = null;
		
		try {
			// 한 개의 포트는 한 개의 프로그램만 사용 가능 / 7777번의 서버소켓 생성
			serverSocket = new ServerSocket(7777);
			
			// 포트 개방
			System.out.println("서버가 준비되었습니다.");
			
			// 대기
			socket = serverSocket.accept();
			System.out.println("클라이언트가 연결되었습니다.");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("[에러] : " + e.getMessage());
		}	finally {
			if(socket != null) try {socket.close();} catch(IOException e) {}
			if(serverSocket != null) try {serverSocket.close();} catch(IOException e) {}
		}
	}

}

프롬프트에서 프로그램 실행



연결하기

package pack1;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClientEx01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Socket socket = null;
		
		try {
			System.out.println("서버와 연결을 시작합니다.");
			
			// 소켓은 접속이된다는 의미
			// 서로 다른 컴퓨터와의 교신.. 
			socket = new Socket("localhost", 7777);
			System.out.println("서버와 연결되었습니다.");
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			System.out.println("[에러] : " + e.getMessage());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("[에러] : " + e.getMessage());
		} finally {
			if(socket != null) try {socket.close();} catch(IOException e) {}
		}
	}

}



서버가 보낸 메세지 클라이언트가 받기

TCPServer

package pack2;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServerEx01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ServerSocket serverSocket = null;
		Socket socket = null;
		
		// 보내기 / 한글을 보내려고 Buffered
		BufferedWriter bw= null;
		try {
			
			serverSocket = new ServerSocket(7777);
			
			// 포트 개방
			System.out.println("서버가 준비되었습니다.");
			
			// 대기 / 소켓 하나당 클라이언트 하나
			socket = serverSocket.accept();
			System.out.println("클라이언트가 연결되었습니다.");
			
			// new OutputStreamWriter : BufferedWriter와 getOutputSream의 연결
			bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			bw.write("Hello Client" + System.lineSeparator());
			
			System.out.println("전송이 완료되었습니다.");
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("[에러] : " + e.getMessage());
		}	finally {
			if(bw != null) try {bw.close();} catch(IOException e) {}
			if(socket != null) try {socket.close();} catch(IOException e) {}
			if(serverSocket != null) try {serverSocket.close();} catch(IOException e) {}
		}
	}

}



TCPClient

package pack2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClientEx01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Socket socket = null;
		
		// 받기 / 연결
		BufferedReader br = null;
		
		try {
			System.out.println("서버와 연결을 시작합니다.");
			
			// 소켓은 접속이된다는 의미
			// 서로 다른 컴퓨터와의 교신.. 
			socket = new Socket("localhost", 7777);
			System.out.println("서버와 연결되었습니다.");
			
			// 읽고
			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			
			// 처리
			System.out.println("메시지 : " + br.readLine());
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			System.out.println("[에러] : " + e.getMessage());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("[에러] : " + e.getMessage());
		} finally {
			if(br != null) try {br.close();} catch(IOException e) {}
			if(socket != null) try {socket.close();} catch(IOException e) {}
		}
	}

}



클라이언트가 보낸것을 서버가 받기

프롬프트에서 server 실행 -> 클라이언트 실행하면 프롬프트에 뜸 -> 프롬프트 서버에서 확인

Client

package pack3;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClientEx01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Socket socket = null;
		
		BufferedWriter bw = null;
		try {
			System.out.println("서버와 연결을 시작합니다.");
            
            /*
			Socket 객체를 생성함과 동시에 연결 요청을 하려면 
            생성자의 매개값으로 서버의 IP주소와 바인딩 포트 변호를 제공
            */
			socket = new Socket("localhost", 7777);
			System.out.println("서버와 연결되었습니다.");
			
			bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

			bw.write("Hello Client" + System.lineSeparator());
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			System.out.println("[에러] : " + e.getMessage());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("[에러] : " + e.getMessage());
		} finally {
			if(bw != null) try {bw.close();} catch(IOException e) {}
			if(socket != null) try {socket.close();} catch(IOException e) {}
		}
	}

}

server

package pack3;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServerEx01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ServerSocket serverSocket = null;
		Socket socket = null;
		
		BufferedReader br = null;
		try {
			// 한 개의 포트는 한 개의 프로그램만 사용 가능 / 7777번의 서버소켓 생성
			serverSocket = new ServerSocket(7777);
			
			// 포트 개방
			System.out.println("서버가 준비되었습니다.");
			
			// 대기
			socket = serverSocket.accept();
			System.out.println("클라이언트가 연결되었습니다.");
			
			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			System.out.println("메시지 : " + br.readLine());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("[에러] : " + e.getMessage());
		}	finally {
			if(br != null) try {br.close();} catch(IOException e) {}
			if(socket != null) try {socket.close();} catch(IOException e) {}
			if(serverSocket != null) try {serverSocket.close();} catch(IOException e) {}
		}
	}

}

여러 줄 받기

Client

// utf-8로 한글 깨짐 막기
			bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
			
			// 이렇게도 할 수있지만
//			bw.write("안녕 서버 1" + System.lineSeparator());
//			bw.write("안녕 서버 2" + System.lineSeparator());
//			bw.write("안녕 서버 3" + System.lineSeparator());
			
			bw.write("안녕 서버1:안녕 서버2:안녕 서버3" + System.lineSeparator());

server

// utf-8로 한글 깨짐 막기
			br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
			
//			System.out.println("메시지 : " + br.readLine());
//			System.out.println("메시지 : " + br.readLine());
//			System.out.println("메시지 : " + br.readLine());
			
			// 구분자 단위로 나눠서 받기
			String[] arrMsg = br.readLine().split(":");
			for(String msg : arrMsg) {
				System.out.println(msg);
			}
			



교차연결 - echo

에코 ( 클라이언트가 던지면 그대로 리턴 ) , 서버와 클라이언트가 인풋,아웃풋 스트림이 둘 다 있어야한다..

server

package pack4;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServerEx01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ServerSocket serverSocket = null;
		Socket socket = null;
		
		BufferedReader br = null;
		BufferedWriter bw = null;
		
		try {
			serverSocket = new ServerSocket(7777);
			System.out.println("서버가 준비되었습니다.");
			
			socket = serverSocket.accept();
			System.out.println("클라이언트가 연결되었습니다.");
			
			br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
			bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
			
			// 읽기 / 외부에서 메시지를 받고
			String msg = br.readLine();
			System.out.println("메세지 : " + msg);
			
			// 다시 찍어냄
			bw.write(msg + System.lineSeparator());
			
			// 전송 완료 / 다 보냈음
			bw.flush();
			System.out.println("전송이 완료되었습니다.");
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("[에러] : " + e.getMessage());
		}	finally {
			// 반드시 소켓 위에서 닫아줘야한다.
			if(br != null) try {br.close();} catch(IOException e) {}
			if(bw != null) try {bw.close();} catch(IOException e) {}
			if(socket != null) try {socket.close();} catch(IOException e) {}
			if(serverSocket != null) try {serverSocket.close();} catch(IOException e) {}
		}
	}

}

Client

package pack4;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClientEx01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Socket socket = null;
		
		BufferedWriter bw = null;
		BufferedReader br = null;
		try {
			System.out.println("서버와 연결을 시작합니다.");
	
			socket = new Socket("localhost", 7777);
			System.out.println("서버와 연결되었습니다.");
			
			bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
			br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
			
			bw.write("Hello Echo Server" + System.lineSeparator());
			bw.flush();
			
			System.out.println("전송이 완료되었습니다.");
			
			// 읽기
			String msg = br.readLine();
			System.out.println("에코 메세지 : " + msg);
			
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			System.out.println("[에러] : " + e.getMessage());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("[에러] : " + e.getMessage());
		} finally {
			if(bw != null) try {bw.close();} catch(IOException e) {}
			if(br != null) try {br.close();} catch(IOException e) {}
			if(socket != null) try {socket.close();} catch(IOException e) {}
		}
	}

}

실행

클라이언트 실행

완료 ~!



클라이언트에서 구구단 단수 입력 -> 서버에서 구구단 문자열 만들어주고(로직) -> 클라이언트에서 출력

TCPServer

package pack5;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServerEx01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ServerSocket serverSocket = null;
		
		Socket socket = null;
		
		BufferedReader br = null;
		BufferedWriter bw = null;
		
		try {
			serverSocket = new ServerSocket(7777);
			System.out.println("서버가 준비되었습니다.");
			
			// 클라이언트에서 연결할 때까지 대기
			socket = serverSocket.accept();
			System.out.println("클라이언트가 연결되었습니다.");
			
			br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
			bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
			
			int msg = Integer.parseInt(br.readLine());
			
			for(int i=1; i<=9; i++) {
				bw.write(msg + "X" + i + "=" + (msg*i) + System.lineSeparator());
			}
			
			bw.flush();
			System.out.println("전송이 완료되었습니다.");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("[에러] : " + e.getMessage());
		} finally {
			if(bw != null) try {bw.close();} catch(IOException e) {}
			if(br != null) try {br.close();} catch(IOException e) {}
			if(socket != null) try {socket.close();} catch(IOException e) {}
			if(serverSocket != null) try {serverSocket.close();} catch(IOException e) {}
		}
		
	}

}

TCPClient

package pack5;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClientEx01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Socket socket = null;
		
		BufferedReader br = null;
		BufferedWriter bw = null;
		
		
		try {
			System.out.println("서버와 연결을 시작합니다.");
			socket = new Socket("localhost",7777);
			
			bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
			
			bw.write("7" + System.lineSeparator());
			bw.flush();
			System.out.println("전송이 완료되었습니다.");
			
			br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
			
			
			String msg = "";
			while((msg = br.readLine()) != null) {
				System.out.println(msg);
			}
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			System.out.println("[에러] : " + e.getMessage());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("[에러] : " + e.getMessage());
		} finally {
			if(br != null) try {br.close();} catch(IOException e) {}
			if(bw != null) try {bw.close();} catch(IOException e) {}
			if(socket != null) try {socket.close();} catch(IOException e) {}
		}
		
	}

}



profile
개발자 꿈나무

0개의 댓글