관리 메뉴

거니의 velog

230908_입출력 4 본문

대덕인재개발원/대덕인재개발원_자바기반 애플리케이션

230908_입출력 4

Unlimited00 2023. 9. 8. 13:15

[InetAddressTest.java]

package kr.or.ddit.basic;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class InetAddressTest {

	public static void main(String[] args) throws UnknownHostException {
		
		// InetAddress 클래스 ==> IP주소를 다루기 위한 클래스
		
		// www.naver.com의 IP정보 구하기
		InetAddress ip = InetAddress.getByName("www.naver.com");
		
		System.out.println("HostName : " + ip.getHostName()); // HostName : www.naver.com
		System.out.println("HostAddress : " + ip.getHostAddress()); // HostAddress : 223.130.195.95
		System.out.println("toString : " + ip.toString()); // toString : www.naver.com/223.130.195.95
		System.out.println();
		
		// 자신의 컴퓨터의 IP정보 구하기
		InetAddress localIp = InetAddress.getLocalHost();
		
		System.out.println("내 컴퓨터의 HostName : " + localIp.getHostName()); // 내 컴퓨터의 HostName : DESKTOP-EO4O3QL
		System.out.println("내 컴퓨터의 HostAddress : " + localIp.getHostAddress()); // 내 컴퓨터의 HostAddress : 192.168.36.116
		System.out.println("내 컴퓨터의 toString : " + localIp.toString()); // 내 컴퓨터의 toString : DESKTOP-EO4O3QL/192.168.36.116
		System.out.println();
		
		// IP주소가 여러 개인 호스트의 IP정보 가져오기
//		InetAddress[] ipArr = InetAddress.getAllByName("www.naver.com");
//		InetAddress[] ipArr = InetAddress.getAllByName("www.daum.net");
		InetAddress[] ipArr = InetAddress.getAllByName("www.nate.com");
		for(InetAddress nIp : ipArr) {
			System.out.println("toString : " + nIp.toString());
		}
//		toString : www.naver.com/223.130.195.95
//		toString : www.naver.com/223.130.195.200
		
//		toString : www.daum.net/121.53.105.193 -> 접속 안됨
		
//		toString : www.nate.com/120.50.131.112
		
	}

}


[URLTest01.java]

package kr.or.ddit.basic;

import java.net.MalformedURLException;
import java.net.URL;

public class URLTest01 {

	public static void main(String[] args) throws MalformedURLException {
		
		// URL 클래스 ==> 인터넷에 존재하는 서버들의 자원에 접근할 수 있는 주소를 다루는 클래스
		
		// URL주소 구조
		// 		==> 프로토콜://호스트명:포트번호/경로명/파일명?쿼리스트링#참조
		// 		예) https://ddit.or.kr:443/index.html?tttt=123
		
//		URL url = new URL("https://ddit.or.kr:443/index.html?tttt=123");
		URL url = new URL("https", "ddit.or.kr", 443, "index.html?tttt=123");
		
		System.out.println("URL 클래스를 이용한 URL 정보 출력하기");
		System.out.println("Protocol : " + url.getProtocol());
		System.out.println("Host : " + url.getHost());
		System.out.println("Port : " + url.getPort());
		System.out.println("File : " + url.getFile());
		System.out.println("Path : " + url.getPath());
		System.out.println("Query : " + url.getQuery());
		System.out.println();
		
		System.out.println(url.toExternalForm()); // https://ddit.or.kr:443index.html?tttt=123
		
//		URL 클래스를 이용한 URL 정보 출력하기
//		Protocol : https
//		Host : ddit.or.kr
//		Port : 443
//		File : index.html?tttt=123
//		Path : index.html
//		Query : tttt=123
		
	}

}


[URLTest02.java]

package kr.or.ddit.basic;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;

public class URLTest02 {

	public static void main(String[] args) throws IOException {
		
		// URLConnection 클래스 ==> 애플리케이션과 URL간의 통신 연결을 위한 클래스
		
		// 특정 서버의 정보와 URL의 내용을 가져와 출력하는 예제
		URL url = new URL("https://www.naver.com/index.html");
		
		// URLConnection 객체 구하기 ==> URL객체를 이용하여 구한다.
		URLConnection urlCon = url.openConnection();
		
		// Header정보 가져오기 
		// 		==> 구한 Map객체의 key값은 Header정보의 이름을 나타내고
		//						value값은 Header정보의 값을 나타낸다.
		Map<String, List<String>> headerMap = urlCon.getHeaderFields();
		
		for(String headerKey : headerMap.keySet()) {
			System.out.println(headerKey + " : " + headerMap.get(headerKey));
		}
		System.out.println("--------------------------------------------");
		
	}

}


[URLTest02.java]

package kr.or.ddit.basic;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;

public class URLTest02 {

	public static void main(String[] args) throws IOException {
		
		// URLConnection 클래스 ==> 애플리케이션과 URL간의 통신 연결을 위한 클래스
		
		// 특정 서버의 정보와 URL의 내용을 가져와 출력하는 예제
		URL url = new URL("https://www.naver.com/index.html");
		
		// URLConnection 객체 구하기 ==> URL객체를 이용하여 구한다.
		URLConnection urlCon = url.openConnection();
		
		// Header정보 가져오기 
		// 		==> 구한 Map객체의 key값은 Header정보의 이름을 나타내고
		//						value값은 Header정보의 값을 나타낸다.
		Map<String, List<String>> headerMap = urlCon.getHeaderFields();
		
		for(String headerKey : headerMap.keySet()) {
			System.out.println(headerKey + " : " + headerMap.get(headerKey));
		}
		System.out.println();
		System.out.println("--------------------------------------------");
		System.out.println();
		
		// 해당 URL이 지정한 문서의 내용을 가져오기 (즉 index.html 문서 내용 가져오기)
		
		// 방법1 ==> URLConnection 객체를 이용하는 방법
		// 파일을 가져오기 위한 입력 스트림 객체 생성
		// 바이트 기반 스트림을 문자 기반 스트림으로 바꿔줘야 한다.
		InputStream in = urlCon.getInputStream();
		InputStreamReader isr = new InputStreamReader(in, "utf-8");
		BufferedReader br = new BufferedReader(isr);
		
		// 자료 내용을 읽어와 화면에 출력하기
		while(true) {
			String str = br.readLine(); // 한 줄씩 읽어오기
			if(str == null) break;
			System.out.println(str);
		}
		
		br.close();
		
		// 방법2 ==> URL 객체를 이용하는 방법
		
		
	}

}

package kr.or.ddit.basic;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;

public class URLTest02 {

	public static void main(String[] args) throws IOException {
		
		// URLConnection 클래스 ==> 애플리케이션과 URL간의 통신 연결을 위한 클래스
		
		// 특정 서버의 정보와 URL의 내용을 가져와 출력하는 예제
		URL url = new URL("https://www.naver.com/index.html");
		
		// URLConnection 객체 구하기 ==> URL객체를 이용하여 구한다.
		URLConnection urlCon = url.openConnection();
		
		// Header정보 가져오기 
		// 		==> 구한 Map객체의 key값은 Header정보의 이름을 나타내고
		//						value값은 Header정보의 값을 나타낸다.
		Map<String, List<String>> headerMap = urlCon.getHeaderFields();
		
		for(String headerKey : headerMap.keySet()) {
			System.out.println(headerKey + " : " + headerMap.get(headerKey));
		}
		System.out.println();
		System.out.println("--------------------------------------------");
		System.out.println();
		
		// 해당 URL이 지정한 문서의 내용을 가져오기 (즉 index.html 문서 내용 가져오기)
		
		// 방법1 ==> URLConnection 객체를 이용하는 방법
		// 파일을 가져오기 위한 입력 스트림 객체 생성
		// 바이트 기반 스트림을 문자 기반 스트림으로 바꿔줘야 한다.
//		InputStream in = urlCon.getInputStream();
//		InputStreamReader isr = new InputStreamReader(in, "utf-8");
//		BufferedReader br = new BufferedReader(isr);
//		
//		// 자료 내용을 읽어와 화면에 출력하기
//		while(true) {
//			String str = br.readLine(); // 한 줄씩 읽어오기
//			if(str == null) break;
//			System.out.println(str);
//		}
//		
//		br.close();
		
		// 방법2 ==> URL 객체를 이용하는 방법 (URL 객체의 openStream() 메서드 이용)
		InputStream in2 = url.openStream();
		BufferedReader br2 = new BufferedReader(new InputStreamReader(in2, "utf-8"));
		
		String temp;
		while( (temp = br2.readLine()) != null ) {
			System.out.println(temp);
		}
		
		br2.close();
		
	}

}


[TcpServer01.java]

package kr.or.ddit.basic.tcp;

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

public class TcpServer01 {

	public static void main(String[] args) {
		
		try {
			// TCP 소켓 통신을 하기 위해 ServerSocket 객체를 생성한다.
			ServerSocket server = new ServerSocket(7777);
			
			System.out.println("클라이언트의 접속을 기다립니다...");
			
			// accept()메서드
			//		==> 클라이언트에서 연결 요청이 올 때까지 기다린다.
			// 		==> 연결 요청이 오면 새로운 Socket 객체를 생성해서
			//			클라이언트의 Socket과 연결한다.
			Socket socket = server.accept();
			
			// 이 부분부터는 클라이언트와 연결이 완료된 이후에 처리할 내용을 작성한다.
			System.out.println("클라이언트와 연결되었습니다...");
			System.out.println();
			
			// 상대방과 연결된 Socket객체를 이용하여 상대방의 정보를 구할 수 있다.
			System.out.println("접속된 상대방의 정보");
			System.out.println("IP주소 : " + socket.getInetAddress().getHostAddress());
			System.out.println("Port 번호 : " + socket.getPort());
			System.out.println();
			
			System.out.println("연결된 내 컴퓨터 정보");
			System.out.println("IP주소 : " + socket.getLocalAddress());
			System.out.println("Port번호 : " + socket.getLocalPort());
			System.out.println();
			
			// 클라이언트에게 메시지 보내기
			// Socket의 OutputStream객체를 이용해서 전송한다.
			// ( Socket의 getOutputStream()메서드로 스트림 객체를 구한다.)
			OutputStream out = socket.getOutputStream(); 
			// 바이트 기반 스트림 -> 문자 기반 스트림으로 변환되도록 보조 스트림 추가
			DataOutputStream dout = new DataOutputStream(out);
			
			// 클라이언트에게 데이터(메시지) 보내기
			// ==> Socket을 이용해서 구한 OutputStream의 출력 메서드를 사용하면 된다.
			dout.writeUTF("환영합니다... 어서오세요...");
			
			System.out.println("메시지를 보냈습니다...");
			
			// 사용했던 스트림과 소켓 닫기
			dout.close();
			socket.close();
			server.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

}

[TcpClient01.java]

package kr.or.ddit.basic.tcp;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

public class TcpClient01 {

	public static void main(String[] args) {
		
		/*
		 * 통신에서 현재 자신의 컴퓨터를 나타내는 방법
		 * 1) 원래의 IP주소 : 예) 192.168.36.116
		 * 2) 지정된 IP주소 : 127.0.0.1
		 * 3) 원래의 컴퓨터 이름 : 예) DESKTOP-EO4O3QL
		 * 4) 지정된 컴퓨터 이름 : localhost
		 */
		try {
			String serverIp = "localhost";
			
			System.out.println(serverIp + " 서버에 연결 중 입니다...");
			
			// 서버의 IP주소와 Port번호를 지정하여 Socket객체를 생성한다.
			// Socket객체는 생성이 완료되면 자동으로 지정된 서버로 요청 신호를 보낸다.
			Socket socket = new Socket(serverIp, 7777);
			
			// 이 부분부터는 서버와 연결이 완료된 이후에 처리할 내용을 작성한다.
			System.out.println("서버에 연결되었습니다...");
			System.out.println();
			
			// 서버가 보내온 메시지를 받아서 화면에 출력하기
			
			// Socket을 이용하여 InputStream객체를 구한다.
			// ==> Socket객체의 getInputStream()메서드를 이용한다.
			InputStream in = socket.getInputStream();
			// 바이트 기반 스트림 -> 문자 기반 스트림으로 변환되도록 보조 스트림 추가
			DataInputStream din = new DataInputStream(in);
			
			// 스트림 객체의 읽기 메서드를 사용해서 데이터를 받는다.
			System.out.println("서버에서 보내온 메시지 : " + din.readUTF());
			System.out.println();
			
			System.out.println("연결을 종료합니다...");
			
			// 스트림과 소켓 닫기
			din.close();
			socket.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

}

이클립스로는 서버 2개를 동시에 실행하지 못한다.

탐색기를 열자.

D:\A_TeachingMaterial\03_HighJava\workspace\javaNetworkTest\bin

- cmd를 주소창에 쳐서 명령 프롬프트를 두 개 연다. 하나는 서버용, 하나는 클라이언트용

 

- 서버용 : java kr.or.ddit.basic.tcp.TcpServer01

- 클라이언트용 : java kr.or.ddit.basic.tcp.TcpClient01

두 개의 클래스 파일이 실행되는 순간 소켓이 작동한다.


[TcpServer02.java]

package kr.or.ddit.basic.tcp;

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

public class TcpServer02 {

public static void main(String[] args) {
		
		try {
			// TCP 소켓 통신을 하기 위해 ServerSocket 객체를 생성한다.
			ServerSocket server = new ServerSocket(7777);
			
			System.out.println("클라이언트의 접속을 기다립니다...");
			
			Socket socket = server.accept();
			
			System.out.println("클라이언트와 연결되었습니다...");
			System.out.println();
			
			// 데이터 송수신을 위한 스트림 객체 생성
			// 수신용
			DataInputStream din = new DataInputStream(socket.getInputStream());
			// 송신용
			DataOutputStream dout = new DataOutputStream(socket.getOutputStream());
			
			while(true) {
				// 클라이언트가 보낸 메시지를 받는다.
				String str = din.readUTF();
				
				if(str.equals("/end")) break;
				System.out.println("클라이언트가 보낸 메시지 : " + str);
				
				// 클라이언트가 보낸 메시지를 그대로 돌려 준다.
				dout.writeUTF(str);
			}
			
			dout.close();
			socket.close();
			server.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

}

[TcpClient02.java]

package kr.or.ddit.basic.tcp;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.Scanner;

public class TcpClient02 {

	public static void main(String[] args) {
			
		Scanner sc = new Scanner(System.in);
		
		try {
			String serverIp = "localhost";
			System.out.println(serverIp + " 서버에 연결 중 입니다...");
			
			Socket socket = new Socket(serverIp, 7777);
			
			// 이 부분부터는 서버와 연결이 완료된 이후에 처리할 내용을 작성한다.
			System.out.println("서버에 연결되었습니다...");
			System.out.println();
			
			// 데이터 송수신을 위한 스트림 객체 생성
			// 수신용
			DataInputStream din = new DataInputStream(socket.getInputStream());
			// 송신용
			DataOutputStream dout = new DataOutputStream(socket.getOutputStream());
			
			// 서버가 보내온 메시지를 받아서 화면에 출력하기
			while(true) {
				System.out.print("서버로 보낼 메시지 입력 >> ");
				String str = sc.nextLine();
				
				// 입력받은 메시지를 서버로 전송한다.
				dout.writeUTF(str);
				
				if(str.equals("/end")) break;
				
				System.out.println("서버가 보낸 메시지 : " + din.readUTF());
			}
			
			System.out.println("연결을 종료합니다...");
			
			// 스트림과 소켓 닫기
			din.close();
			socket.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

}

- 서버용 : java kr.or.ddit.basic.tcp.TcpServer02

- 클라이언트용 : java kr.or.ddit.basic.tcp.TcpClient02

'대덕인재개발원 > 대덕인재개발원_자바기반 애플리케이션' 카테고리의 다른 글

230912_입출력 6  (0) 2023.09.11
230911_입출력 5  (0) 2023.09.11
230907_입출력 3  (2) 2023.09.07
230906_입출력 2  (0) 2023.09.06
230905_입출력 1  (0) 2023.09.04