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 |