[Java]活用13~21話の内容整理


スレッド優先度、ステータス制御からUDPソケットプログラミングへ


スレッド優先度の設定方法

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

  • ただし、相対値であるため、他の実行環境におけるすべてのプログラムが同じ操作を実行できる保証はない

  • 優先度値が指定されていない場合は、デフォルト値5を指定します.

  • スレッド(start()を実行する前に呼び出す必要があります

  • CPUがマルチコアの場合、異なる値になる場合があります

  • スレッドがCPUとは独立して動作する場合、優先度の高いスレッドは同じ結果を出力します.
    必ずしも
  • スレッドのステータスを制御する方法


    (1)sleep():スレッド一時停止
    (2)interrupt():スレッドを終了
    (3)join():他のスレッドの実行完了を待ち、異常を放出するため、異常処理が必要

    スレッド同期


    バックグラウンド)マルチスレッド環境内の複数のスレッドが1つのオブジェクトを使用する場合に存在する
    各スレッドがオブジェクトのフィールド値を変更している場合、プログラムが予想通りに実行される保証はありません.
  • で、すべての操作が完了するまでスレッドがオブジェクトの値を変更しないことを可能にします.

    同期を指定する手順は、次のとおりです。


    (1)同期方法synchronized 메소드명(){}(2)同期ブロックsynchronized (this) {}

    りゅうしき


    データ移動チャネル
      입력스트림       출력스트림
    입력	 →	프로그램	     →	   출력
    
    파일		   자바		   파일
    키보드				   모니터
    네트워크				   네트워크
    다른 프로그램		   	   다른 프로그램

    ストリームフィーチャー


    (1)FIFO資料構造
    (2)一方向処理;I/Oを同時に処理するのではなく、ネットワークを一方向に処理できます.
    (3)データ型によるバイト/文字の区分

    ストリーム関連の主要クラス


    フロー最上位クラス(抽象クラス)
    바이트 단위 스트림				문자단위 스트림
    입력 | 출력					  	입력 | 출력
    InputStream|OutputStream		Reader|Writer|

    バイトストリーム

  • FileInputStream InputStream継承InputStream,
  • FileOutputStreamオブジェクトを作成する場合、パラメータがtrueの場合、
  • のオーバーライドを防止できます.

    入力フローの主なメソッド


    メソッド名説明intread()は1バイト単位で読み出し、戻りintread(byte[]b)パラメータ配列長単位で読み出し、戻りintread(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


  • 中間一時記憶、空き容量

  • ハードディスク(HDD)の劣化やOSの問題で読み取り速度が低下すると、プログラムの実行自体も
    遅くなりました.この場合、バッファをバッファに入れて保存し、一度に処理することで、処理速度を向上させることができる
  • バッファ補助フロークラス


    メソッド名説明BufferedInputStreamバイト入力補助ストリームBufferedOutputStreamバイト出力補助ストリームBufferedReader文字単位入力補助ストリームBufferedWriter文字単位出力補助ストリーム
  • アシストストリームを使用する場合、使用しない場合よりもはるかに速い
  • ネットワーク

  • コンピュータ間でデータを交換可能な相互接続通信回線
  • WebアプリケーションWebサイト、Webゲーム、チャットツール
  • javaは、ネットワークを介してデータ通信を行うAPI→javaを提供する.ネットワークパッケージ
  • ネットワーク用語


    (1)IPコンピュータを区別するための一意の値
    (2)ポートコンピュータ相互接続部,ポートを介したネットワーク通信(整数値)
    (3)Socketネットワークにおいて,各コンピュータがポートを介して通信するエンドポイント(endpoint)
    (4)サーバサービスを提供するコンピュータ、クライアントの要求処理
    (5)クライアントサービスを利用するコンピュータ(サーバにサービスを要求する)

    ネットワーク関連クラス


    クラス記述はURLインターネットによるサーバ通信URL接続URLオブジェクトの接続,抽象クラスを記述する.サブクラス:HttpURL接続サーバソケット/ソケット(TCP/IP)通信用クラスDataramPacket/DataramSocketUDP通信
    他のAPIを使用したり、スクロールしたりするときにも使用できます.

    TCP/IP差異


    TCP特徴データ伝送信頼性が高く、伝送順序保証データ伝送信頼性が低い、伝送順序保証データ受信の有無、UDPよりも遅いデータを受信するか否かが確定できない、接続方式がTCPより1対1速い接続後通信1対非接続通信

    TCPソケット通信プロセス


    (1)サーバがサーバソケットを使用してクライアントを要求する準備
    (2)クライアントがサーバ情報(IPまたはポート番号)によりスロットを作成する
    (3)サーバへの接続要求
    (4)サーバがクライアントからの接続要求を受信した場合,ソケット作成後に接続する.
    (5)サーバスロットとクライアントスロット間の1対1の通信

    任意に作成したWebサーバ上で、ブラウザからファイル名(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());
    		}
    	}
    }
  • Webサーバは、無限ループにおいてユーザの要求に応答する
  • .

    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());
    		}
    	}
    
    }