Day 45 (23.02.28)

Jane·2023년 2월 28일
0

IT 수업 정리

목록 보기
56/124

1. URLConnection

  • 주소를 입력받는다.( https:// 입력하지 않으면 MalformedURLException 발생 )
  • 입력받은 주소를 토대로 URL 객체를 생성한다.
  • url의 openConnection에는 InputStream이 있다.
  • BufferReader에서 연결한 주소의 페이지를 읽고, FileWriter에서 버퍼로 읽은 줄만큼 file.html에 써나간다.
import java.io.*;
import java.net.*;
import java.util.Scanner;

class URLConEx {
	public URLConEx() {

		String code = null;
		System.out.println("웹 주소를 입력하세요");
		Scanner scan = new Scanner(System.in);
		String address = scan.next();

		try {
			URL url = new URL(address);
			URLConnection con = url.openConnection();
            // 인터넷 연결이 되어있지 않으면 error catch

			BufferedReader webData = new BufferedReader(new InputStreamReader(con.getInputStream()));
			FileWriter fw = new FileWriter("C:\\Users\\USER\\file.html", false);
            
			while ((code = webData.readLine()) != null) {
				fw.write(code);
			}
			System.out.println("the end");

			fw.close();
			webData.close();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

public class JavaPractice {
	public static void main(String[] args) {
		new URLConEx();
	}
}

[Console]
웹 주소를 입력하세요
(입력 >> ) https://www.daum.net
the end


2. 소켓


2-1. 소켓 프로그래밍 연습

  1. TCPServer.java
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer { // 1. 서버 프로그램 만들기
	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		Socket socket = null;
		
		try {
			serverSocket = new ServerSocket(7777); // 포트 번호를 가진 객체 생성
			socket = serverSocket.accept(); // 서버소켓을 받는다.
			
			Sender sender = new Sender(socket);
	        Receiver receiver = new Receiver(socket);

	        sender.start();
	        receiver.start();
		}
		catch(Exception e) {}
	}
}
  1. Sender.java (Thread)
import java.io.DataOutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Sender extends Thread { // 2. Sender 만들기 - Thread 상속

	Socket socket;
	DataOutputStream out;
	String name;

	public Sender(Socket socket) {
		this.socket = socket;

		try {
			out = new DataOutputStream(socket.getOutputStream()); // 소켓의 스트림으로 객체 생성
			name = "[" + socket.getInetAddress() + ":" + socket.getPort() + "]"; // 소켓 이름

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public void run() {
		Scanner scan = new Scanner(System.in);
		while (out != null) {
			try {
				out.writeUTF(name + scan.nextLine());
			} catch (Exception e) {

			}
		}
	}
}
  1. Receiver.java (Thread)
import java.io.DataInputStream;
import java.net.Socket;

public class Receiver extends Thread { // 3. Receiver 만들기 - Thread 상속

	Socket socket;
	DataInputStream in; // output을 input으로 바꾸기

	public Receiver(Socket socket) {
		this.socket = socket;

		try {
			in = new DataInputStream(socket.getInputStream()); // 소켓의 스트림으로 객체 생성

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public void run() {

		while (in != null) {
			try {
				System.out.println(in.readUTF());
			} catch (Exception e) {

			}
		}
	}
}
  1. TCPClient.java
import java.net.Socket;

public class TCPClient { // 4. 클라이언트 만들기
	public static void main(String[] args) {

		String serverIP = "127.0.0.1"; // Local Host (자기 자신)

		try {
			Socket socket = new Socket(serverIP, 7777); // 소켓 객체 생성(호스트, 서버 포트번호)

			System.out.println("서버에 연결되었습니다.");

			Sender sender = new Sender(socket);
			Receiver receiver = new Receiver(socket);

			sender.start();
			receiver.start();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
  • 서버부터 실행한 다음 클라이언트를 실행한다.

[Client - Console]
서버에 연결되었습니다.
안녕하세요
[/127.0.0.1:57577]나도 되려나
ㅎㅎ

[Server - Console]
[/127.0.0.1:7777]안녕하세요
나도 되려나
[/127.0.0.1:7777]ㅎㅎ


2-2. 서버에 접속하여 채팅하기

  • IPv4 주소를 다른 사람이 만든 Client.java의 serverIP에 입력한다.
  • 접속하는 서버를 먼저 켜고 있어야 한다.
  • 서버가 돌아가고 있으면, 다른 클라이언트가 서버에 들어와서 통신할 수 있다.

[Console]
안녕하세요
보이시나[/192.168.0.125:7777]안녕하세요

[/192.168.0.125:7777]\
[/192.168.0.125:7777]네 잘보여요
[/192.168.0.125:7777]감사합니디ㅏ


2-3. 서버 프로그램의 구조

ServerSocket 클래스 >> accept()

  • 서버는 기다리는 쪽이다.
  • 클라이언트를 실행하면 포트 번호를 이용하여 통신을 걸고,
    서버는 accept()로 상대방의 소켓을 받아 연결한다.
	public Socket accept() throws IOException {
        if (isClosed())
            throw new SocketException("Socket is closed");
        if (!isBound())
            throw new SocketException("Socket is not bound yet");
        Socket s = new Socket((SocketImpl) null);
        implAccept(s);
        return s;
    }

Sender, Receiver

  • Thread 형태로 같이 실행한다. 키보드 처리도 Stream으로 보내고 받는다.
    (Thread로 하지 않으면 while문만 돌아서, 받거나 보내는 행동을 할 수 없다.)
  • run()에서는 while문으로 돌아서 진행된다.
    • Sender : OutPutStream에서 스캐너를 통해 계속 입력받고, 엔터를 누르면 write를 멈추고 상대방에게 넘긴다.
    • Receiver : Sender에서 입력받은 것이 오면 InputStream에서 출력한다.
profile
velog, GitHub, Notion 등에 작업물을 정리하고 있습니다.

0개의 댓글