Java

네트워크, URL, 서버

걷는 청년 2024. 7. 24. 11:55

URL 클래스를 활용해서 지정한 웹 서버의 문서 읽기 실습

 

package pack;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;

// URL 클래스로 특정 웹서버 컴퓨터 문서 읽기
// 인터넷이 가능한 서버들의 자원에 접근하여 주소 및 기타 정보를 다루는 클래스
public class Net1URL {
	
	public static void main(String[] args) {
		try {
			URL url = new URL("https://www.daum.net");
			// https://www.naver.com:80/index.html
			// http 보안용 서버 --> https. tcp 프로토콜 기반 응용 프로그램 계층에서 사용
			InputStream is = url.openStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
			//System.out.println(br.read());
			
			// 읽은 문서 파일로 저장
			PrintWriter pw = new PrintWriter(System.out, true);
			PrintWriter fw = new PrintWriter(new FileOutputStream("c:/work/ok.html"));
			
			String line = "";
			while((line = br.readLine()) != null) {
				pw.println(line); // console로 출력
				fw.println(line);
				fw.flush();
			}
			br.close();
			is.close();
			pw.close();
			fw.close();
			
		} catch (Exception e) {
			System.out.println("error : " + e);
		}
		
	}

}

 

 

 

Jsoup 라이브러리를 이용

 

package pack;

import java.net.URLEncoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

// 제 3자가 제공하는 라이브러리(jsoup.jar)를 사용해 웹 스크래핑
// HTML 문서 데이터 구문 분석, 자료 추출 및 조작용 오픈 소스

public class Net2 {

	public static void main(String[] args) {
		// 위키백과 사이트에서 검색 결과 읽기
		// https://ko.wikipedia.org/wiki/%EB%B0%B1%EC%84%A4_%EA%B3%B5%EC%A3%BC
		
		try {
			// System.out.println(URLEncoder.encode("백설공주", "UTF-8"));
			
			String url = "https://ko.wikipedia.org/wiki" + URLEncoder.encode("백설공주", "UTF-8");
			// Document : 웹페이지 문서
			Document doc = Jsoup.connect(url).get();
			String text = doc.text();
			//System.out.println(text);
			printKoreanText(text);	// 한글만 추출
			
		} catch (Exception e) {
			System.out.println("error : " + e);
		}
		
	}

	private static void printKoreanText(String text) {
		// 정규 표현식 사용
		// 한글과 공백만 얻기
		Pattern pattern = Pattern.compile("[가-힣\\s]+");
		Matcher matcher = pattern.matcher(text);
		
		while(matcher.find()) {
			String line = matcher.group().trim();
			if(!line.isEmpty()) {	// 빈 줄은 제외
				System.out.println(line);
			}
		}
		
	}
}

 

 

웹에서 활용하는 멀티 스레드를 활용한 복수의 문서 읽기

 

package pack;

import java.net.URLEncoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

// 멀티 스레드로 멀티 태스킹 : 복수 개의 문서 읽기
public class Net3Thread implements Runnable {
	private String url;
	private String title;
	
	public Net3Thread(String url, String title) {
		this.url = url;
		this.title = title;
	}

	@Override
	public void run() {
		try {
			Document doc = Jsoup.connect(url).get(); // 네트워크를 통해 다른 컴에 접속 후 자료 읽기
			String text = doc.text();
			
			System.out.println("--------");
			System.out.println("문서 제목 : " + title);
			
			printKoreanText(text);
		} catch (Exception e) {
			System.out.println("read error : " + e);
		}
	}

	public static void main(String[] args) throws Exception {
		String[] title = { "백설공주", "인어공주" };
		String[] url = { "https://ko.wikipedia.org/wiki/" + URLEncoder.encode(title[0], "UTF-8"),
				"https://ko.wikipedia.org/wiki/" + URLEncoder.encode(title[1], "UTF-8") };

		for (int i = 0; i < url.length; i++) {
			Thread thread = new Thread(new Net3Thread(url[i], title[i]));
			thread.start();
		}

		
	}
	
	private static void printKoreanText(String text) {
		// 정규 표현식 사용
		// 한글과 공백만 얻기
		Pattern pattern = Pattern.compile("[가-힣\\s]+");
		Matcher matcher = pattern.matcher(text);
		
		while(matcher.find()) {
			String line = matcher.group().trim();
			if(!line.isEmpty() && line.length() > 1) {	// 빈 줄, 1글자는 제외
				System.out.println(line);
			}
		}
		
	}
	
}

 

 

 

소켓 통신을 활용하여 서버를 열고 클라이언트를 작성해 접속해보기

 

서버

package pack;

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

public class Net4TestServer {

	public static void main(String[] args) {
		// 단순 서버
		ServerSocket ss = null;
		
		// 내 컴퓨터가 사용중인 port number 확인
//		for(int i=0; i<65536; i++) {
//			try {
//				ss = new ServerSocket(i);
//				ss.close();
//			} catch (Exception e) {
//				System.out.println(i + "번 포트는 사용중");
//			}
//		}
//		System.out.println("확인 종료");
		
		Socket socket = null;	// TCP 기반의 통신용 클래스(파일)
		try {
			ss = new ServerSocket(9999);
			System.out.println("server start...");
			socket = ss.accept();	// 서버 소켓으로부터 클라이언트 컴과 통신하기위한 개별 소켓 생성
			
			BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			String data = reader.readLine();
			System.out.println("receive data : " + data);
			
			reader.close();
			socket.close();
			ss.close();
			
		} catch (Exception e) {
			System.out.println("server error : " + e);
		}
		
	}

}

 

 

 

클라이언트

package pack;

import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

public class Net4TestClient {

	public static void main(String[] args) {
		try {
			InetAddress ia = InetAddress.getByName("192.168.0.18");
			//System.out.println(ia);
			//Socket socket = new Socket(ia, 9999);
			
			Socket socket = new Socket("127.0.0.1", 9999);	// 서버와 접속
			
			PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
			writer.println("Hi I'm Lee" + "\n");	// 서버로 자료 전송
			
			writer.close();
			socket.close();
			
		} catch (Exception e) {
			System.out.println("client error : " + e);
		}

		// 특정 컴의 접속 후 메세지 전달음
	}

}

 

'Java' 카테고리의 다른 글

html과 jsp 맛보기  (10) 2024.07.24
웹 서버 만들기 기초  (1) 2024.07.24
Stream, 람다식 DB 연동 활용  (1) 2024.07.24
람다식 활용  (0) 2024.07.24
배열(Array)  (0) 2024.04.11