ネットワークソケット

35278 ワード

guarded suspension


  • ターゲットコードは何ですか?→getRequest()の目的はreturn queueです.remove(); はい.

  • 行く条件は何ですか.→synchronized while(保護条件){wait();}ターゲットコード

  • 保護サスペンションモード

  • オブジェクトのステータスの変化を識別するコードが必要です.(stateChanging Method)
  • [java]Guarded-SUspensionモード
    ※上記の内容を整理※

  • guarded object : queue → LinkedList<Request>();

  • guarded method : getRequest()
    2.1ターゲットコード:queue.remove();
    2.2防御条件:キュー.peek() == null → wait()
    2.3 synchronized method(){while(保護条件){wait()}宛先コード;

  • 状態変更方法:putRequest()→保護対象オブジェクトの状態変化
    3.1 synchronized method(){保護対象の状態変化コード;notifyAll()}
  • LinkedBlockingQueue<>()
    take(),put()→wait()を同期してサポートします.持っていくものがないと出てこない、入ってきたものが出てきて、出すときに使うのが叶います.

    ネットワーク


    通信可能デバイス(インターネット)
  • クライアント:リクエスト側
  • サーバ:応答者
  • IP:ネットワーク上でデバイスを識別する物理識別子.(インターネットプロトコル)、デバイス識別子
  • プロトコル:どのように要求し、どのように回答するか.中華料理店でのりご飯を注文できないような
  • port:デバイスには、どのプログラムに接続するかを決定するフロー識別子および論理識別子である多数のアクションプログラムがある.0~10000番の間に約束のポート番号を指定し、10000番以上でポート番号を決定します.同じポート番号の間で競合が発生します.
  • OSI 7 Layers:各ステージに1つのヘッダがあり、通信内容の検証のために貼られています.全部で7つのヘッダがあり、ヘッダを電気信号に変換して相手のパソコンに渡し、逆順にヘッダを削除します.最後はDATAしか残っていません
  • TCP

  • 接続式通信方式
  • インターネット
  • 信頼性データ保障
  • 電話を例にとると、相手は電話に出なければ通話できず、お互いに伝わる情報がある.相手から私が伝えたメッセージが届いたことを確認できます.
  • WebはTCP方式
  • UDP

  • 非接続通信方式
  • 送受信信号確認プログラムなし
  • 安定性が低く、速度ゲイン
  • 手紙を例にとると、相手が手紙を受け取ったかどうかを知らず、送った手紙の到着日が変わる.
  • 「アドレス」ウィンドウにドメイン名(naver.com)を挿入すると、ドメイン名サーバ(DNS)に移動します.DNSスキーマのリストのドメイン名のIPアドレスを返します.サーバは、返されたIPアドレスを再要求します.

    NSLookUp

    public class NSLookUp {
    	public static void main(String[] args) {
    		String domain = JOptionPane.showInputDialog(
    			"도메인을 입력하시오"
    		);
    		// IP 나타내는 객체
    		InetAddress inetaddr[] = null;
    		
    		try {
    			inetaddr = InetAddress.getAllByName(domain);
    		} catch(UnknownHostException e) {
    			e.printStackTrace();
    		}
    		
    		for(int i = 0; i < inetaddr.length; i++) {
    			System.out.println(inetaddr[i].getHostName());
    			System.out.println(inetaddr[i].getHostAddress());
    			System.out.println(inetaddr[i].toString());
    			System.out.println("---------------------------");			
    		}
    	}// main
    }
  • private final Queue<Request> queue = new LinkedList<Request>();
  • inetaddr = InetAddress.getAllByName(domain);:ドメイン名
  • getHostName():IP番号
  • getHostAddress():ホスト名/ホストアドレス
  • 複数のIPで構成され、配列形式で返却
  • ドメインアドレス.com:80→80ポート接続.サイトは80番ポートを使用することを約束しています.
  • EchoClient / EchoServer

    public class EchoServer {
    	public static void main(String[] args) {
    		Socket sock = null;
    		
    		OutputStream out = null;
    		OutputStreamWriter osw = null;
    		PrintWriter pw = null;
    		
    		InputStream in = null;
    		InputStreamReader isr = null;
    		BufferedReader br = null;
    		
    		try {
    			ServerSocket server = new ServerSocket(10001);
    			System.out.println("접속을 기다립니다.");
    			
    			sock = server.accept();
    			InetAddress inetaddr = sock.getInetAddress();
    			System.out.println(
    				inetaddr.getHostAddress() + " 로 부터 접속하였습니다."
    			);
    			
    			out = sock.getOutputStream();
    			in = sock.getInputStream();
    			
    			osw = new OutputStreamWriter(out);
    			pw = new PrintWriter(osw);
    			
    			isr = new InputStreamReader(in);
    			br = new BufferedReader(isr);
    			
    			String line = null;
    			
    			while( (line = br.readLine()) != null ) {
    				System.out.println(
    					"클라이언트로 부터 전송받은 문자열 : " + line
    				);
    				pw.println(line);
    				pw.flush();				
    			}
    			System.out.println(line);
    		} catch(Exception e) {
    			System.out.println(e);			
    		} finally {
    			try {
    				br.close();
    			} catch(Exception e) {}
    			try {
    				isr.close();
    			} catch(Exception e) {}
    			try {
    				in.close();
    			} catch(Exception e) {}
    			try {
    				pw.close();
    			} catch(Exception e) {}
    			try {
    				osw.close();
    			} catch(Exception e) {}
    			try {
    				out.close();
    			} catch(Exception e) {}
    			try {
    				sock.close();
    			} catch(Exception e) {}
    		}
    	} // main
    }
    public class EchoClient {
    	public static void main(String[] args) {
    		Socket sock = null;
    		
    		OutputStream out = null;
    		OutputStreamWriter osw = null;
    		PrintWriter pw = null;
    		
    		InputStream in = null;
    		InputStreamReader isr = null;
    		BufferedReader br = null;
    		
    		BufferedReader keyboard = null;
    		InputStreamReader keyIsr = null;
    		
    		try {
    			sock = new Socket("127.0.0.1", 10001);
    			
    			keyIsr = new InputStreamReader(System.in);
    			keyboard = new BufferedReader(keyIsr);
    			
    			out = sock.getOutputStream();
    			in = sock.getInputStream();
    			
    			osw = new OutputStreamWriter(out);
    			pw = new PrintWriter(osw);
    			
    			isr = new InputStreamReader(in);
    			br = new BufferedReader(isr);
    			
    			String line = null;
    			
    			while( (line = keyboard.readLine()) != null ) {
    				if(line.equals("quit")) break;
    				pw.println(line);
    				pw.flush();
    				String echo = br.readLine();
    				System.out.println("서버로부터 전달받은 문자열 : " + echo);
    			}
    			pw.close();
    			br.close();
    			sock.close();			
    		} catch(Exception e) {
    			System.out.println(e);
    		} finally {
    			try {
    				keyboard.close();
    			} catch (Exception e) {}
    			try {
    				keyIsr.close();
    			} catch (Exception e) {}
    			try {
    				br.close();
    			} catch (Exception e) {}
    			try {
    				isr.close();
    			} catch (Exception e) {}
    			try {
    				in.close();
    			} catch (Exception e) {}
    			try {
    				pw.close();
    			} catch (Exception e) {}
    			try {
    				osw.close();
    			} catch (Exception e) {}
    			try {
    				out.close();
    			} catch (Exception e) {}
    			try {
    				sock.close();
    			} catch (Exception e) {}
    		}
    	} // main
    }
    サーバを実行してからクライアントを実行

    実行結果toString():ポート番号で接続可能.10001は生成者のポート番号ですServerSocket:サーバスロットの受け入れに伴い、クライアントは接続前にブロックされている.(非運転状態)server.accept() : new Socket(ip, port);
  • 電話機は私が通話する相手を示している.電話番号を押したり、通話ボタンを押したりすれば電話がかけられますが、どのように働いているのか分かりません.電話番号の役割は相手の設備を探すことです.→socketは私が通信する相手の役です.電話で伝えるように、相手の代わりに.
  • OSI 7階の件はSocketが処理する.
  • Socket作成=接続済み.サーバソケットは、接続するために感知する必要があります.接続できるのは、クライアントとサーバにコンセントを作成している場合のみです.
  • サーバnew Socket("127.0.0.1", 10001);を抜くと、クライアントにIPアドレスが与えられます.
  • getInetAddress()読み物があるまでwhile( (line = br.readLine()) != null )で封鎖される.
  • 両方が流れ終わった場合readLine()停止.キーボードで入力し、行をサーバのreadlineに出力し、クライアントのreadlineに移動し、コンソールウィンドウに出力し、キーボードで待機します.
  • out→osw→pw/in→isr→br/soket順に作られているので逆順でクローズ().
  • Client

  • in:socketが出るのは抜くという意味なので、方向性はsocketが出る方向です.
  • isr:byteはcharとして読み取ることができる.
  • br:readline charを読み込みます.
  • echo(String) :
  • System.out :
  • console :
  • out:コンセントから抜いたOutput Streamをコンセントに使用します.
  • osw:PrintWriterの文字をgetOutputStream byte可読に変換
  • pw:char演算.
  • line:keyboradから引き抜く.
  • System.in:キーボードから読み出す
  • keyIsr : readLine()
  • コポラード:InputStreamReader(System.in);readline()具体値
  • 条件文にブロックが初めて出現した.何か読むものがあればlineを作成しprintlnとoutを行います.→brBufferedReader(keyIsr);待機.
  • このコードで重要なのはどこで停止するかです.
  • Server

  • ぐるっと回ってbr埃String echo = br.readLine();待機.
  • こだまはこだまです。

  • echoサーバとは、クライアントから転送されたデータをそのまま返して転送できるサーバのこと.
  • クライアントはサーバにデータを送信し、サーバはデータを受信して返す.