[Java]활용 13~21강 까지의 내용 정리

bacccine·2022년 4월 20일
0

Java

목록 보기
7/7

스레드 우선순위,상태제어부터 UDP 소켓 프로그래밍까지

스레드 우선순위 지정 방법

스레드객체.setPriority(1~10 사이 정수 값)

  • 단, 상대값이기 때문에 다른 실행환경에서의 모든 프로그램에서 동일한 실행을 보장하진 않는다

  • 우선순위 값을 지정하지 않으면 기본값인 5를 지정

  • 스레드 실행(start()) 전 호출해야 한다

  • CPU가 멀티코어인 경우에는 값이 다르게 나올 수 있다

  • 스레드가 CPU에서 독립적으로 실행되면 우선순위가 높아도 결과값이 똑같이 출력되기 때문에
    일정하지 않을 수 있음

스레드 상태 제어 방법

(1) sleep(): 스레드 일시정지
(2) interrupt(): 스레드 종료
(3) join(): 다른 스레드 실행 완료 시까지 대기, 예외를 던지기 때문에 예외 처리를 해야한다

스레드 동기화(syncronized)

배경) 멀티스레드 환경에선 여러 스레드가 하나의 객체를 사용하는 경우 존재
각 스레드에서 해당 객체의 필드 값을 변경하고 있다면 의도한 대로 프로그램의 실행이 보장되지 않는다

  • 하나의 스레드가 모든 작업이 끝날 때까지 다른 스레드가 해당 객체의 값을 변경하지 못하도록 하는 것

동기화 지정 방법

(1) 동기화 메소드
synchronized 메소드명(){}
(2) 동기화 블록
synchronized (this) {}

스트림

데이터가 이동되는 통로

  입력스트림       출력스트림
입력	 →	프로그램	     →	   출력

파일		   자바		   파일
키보드				   모니터
네트워크				   네트워크
다른 프로그램		   	   다른 프로그램

스트림의 특징

(1) FIFO 자료구조
(2) 단방향 처리; 입출력이 동시에 진행되는 것이 아니라 단방향으로망 처리 가능
(3) 데이터 종류에 따라 바이트/문자 구분

스트림 관련 주요 클래스

스트림 최상위 클래스(추상 클래스)

바이트 단위 스트림				문자단위 스트림
입력 | 출력					  	입력 | 출력
InputStream|OutputStream		Reader|Writer|

바이트 단위 스트림

  • FileInputStream은 InputStream을 상속받음
  • FileOutputStream 객체 생성 시 매개변수로 true를 주면 덮어쓰기가 방지된다

입력 스트림 주요 메서드

메서드명설명
int read()1바이트 단위로 읽어 리턴
int read(byte[] b)매개변수 배열 길이 단위로 읽어 리턴
int read(byte[] b,int off,int len)off부터 len 길이만큼 읽어 b 배열 단위로 리턴
void close()자원 해제

정수값을 리턴하며, 더 이상 읽어들일 것이 없으면 -1을 리턴

출력 스트림 주요 메서드

메서드명설명
void write(int b)1바이트 단위로 출력
void write(byte[] b)매개변수 배열 길이 단위로 출력
void write(byte[] b,int off,int len)off부터 len 길이만큼 출력
void flush()출력 버퍼 초기화, 실제 출력 처리 기능
void close()자원 해제

문자 단위 스트림에선 write(String s)/write(String s,int off, int len) 메소드가 추가된다

Buffer

  • 중간 임시 저장소, 여유공간

  • 만약 하드디스크의 노후화나 OS 문제로 인한 읽기 속도가 저하될 경우 프로그램 실행 자체도
    느려진다. 이 때, 버퍼를 두어 버퍼에 저장 후 한꺼번에 처리하면 처리 속도가 향상된다

Buffered 보조 스트림 클래스

메서드명설명
BufferedInputStream바이트 단위 입력 보조 스트림
BufferedOutputStream바이트 단위 출력 보조 스트림
BufferedReader문자 단위 입력 보조 스트림
BufferedWriter문자 단위 출력 보조 스트림
  • 보조 스트림을 사용했을 때, 안 했을 때보다 속도가 많이 빨라진다

네트워크

  • 컴퓨터 간 데이터를 주고받을 수 있는 서로 연결된 통신 회선
  • 네트워크 애플리케이션엔 웹사이트, 온라인 게임, 메신저가 있다
  • 자바에서 네트워크를 통한 데이터 통신을 위한 API 제공 → java.net 패키지

네트워크 관련 용어

(1) IP 컴퓨터를 구별하기 위해 사용되는 고유 값
(2) Port 컴퓨터가 서로 연결된 부분, 포트를 통해 네트워크 통신(정수 값)
(3) Socket 네트워크 상에서 각 컴퓨터가 포트를 통해 통신하는 끝부분(end point)
(4) Server 서비스를 제공하는 컴퓨터, 클라이언트의 요청에 대한 처리
(5) Client 서비스를 사용하는 컴퓨터(서버에 서비스 요청)

네트워크 관련 클래스

클래스설명
URL인터넷을 통한 서버 통신
URLConnectionURL 객체의 연결,추상 클래스이다. 하위 클래스:HttpURLConnection
ServerSocket/Socket소켓(TCP/IP) 통신을 위한 클래스
DatagramPacket/DatagramSocketUDP 통신을 위한 클래스

다른 API를 사용하거나 크롤링할 때 활용되기도 한다

TCP/UDP 차이

구분TCPUDP
특징데이터 전송 신뢰성 높음, 전송 순서 보장데이터 전송 신뢰성 낮음, 전송 순서 보장 안 됨
데이터 수신 여부 확인 가능, UDP에 비해 느림데이터 수신 여부 확인 불가, TCP에 비해 빠름
연결 방식1대1 연결 후 통신1대다 비연결 통신

TCP 소켓 통신 프로세스

(1) 서버는 서버 소켓을 사용해서 클라이언트에게 요청받을 준비
(2) 클라이언트는 서버 정보(IP나 Port 번호)를 통해 소켓 생성
(3) 서버에 연결 요청
(4) 서버는 클라이언트로부터 연결 요청을 받으면 소켓 생성 후 연결
(5) 서버 소켓과 클라이언트 소켓이 1대1 통신

임의로 만든 웹 서버에서 브라우저를 통해 접근 시 해당 파일명(index.html)을 찾아 출력하기 예

public class ThreadEx extends Thread{
	Socket client;
	BufferedReader br;
	PrintWriter pw;
	
	ThreadEx(Socket client){
		this.client = client;
		try{
			br = new BufferedReader(new InputStreamReader(client.getInputStream()));
			pw = new PrintWriter(client.getOutputStream());
		}catch(Exception e){
			System.out.println(e.getMessage());
		}
	}
	
	public void run(){
		BufferedReader brClient = null;
		DataOutputStream dos = null;
		try{
			String firstLine = br.readLine();
			System.out.println(firstLine);
			String fileName = firstLine.substring(firstLine.indexOf("/")+1,firstLine.lastIndexOf("HTTP")-1);
			
			if("".contentEquals(fileName)) {
				fileName="index.html";
			}
			brClient = new BufferedReader(new FileReader(fileName));
			
			String data ="";
			pw.println("HTTP/1.0 200 Document Follows \r\n");
			while((data=brClient.readLine())!=null){
				pw.println(data);
				pw.flush();
			}
		} catch(Exception e){
			System.out.println(e.getMessage());
		}
	}
}
  • 웹서버는 무한 반복을 돌다가 사용자의 요청이 들어오면 응답하는 방식

UDP 서버 통신 예

Server.java
public class Server {

	public static void main(String[] args) {
		try{
			DatagramSocket socket = new DatagramSocket(8888);
			DatagramPacket packet = null;
			
			byte[] msg = null;
			
			while(true){
				msg = new byte[1024];
				packet=new DatagramPacket(msg,msg.length);
				socket.receive(packet);
				
				System.out.println("메시지: "+new String(msg,0,packet.getLength()));
			}
		} catch(Exception e){
			
		}
	}

}
Client.java
public class Client {

	public static void main(String[] args) {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		try{
			InetAddress server = InetAddress.getByName("127.0.0.1");
			while(true){
				String input = br.readLine();
				DatagramSocket socket = new DatagramSocket();
				
				byte[] msg = input.getBytes();
				DatagramPacket packet = new DatagramPacket(msg,msg.length,server,8888);
				socket.send(packet);
				socket.close();
			}
		}catch(Exception e){
			System.out.println(e.getMessage());
		}
	}

}

0개의 댓글