リモートでブラウザに出力

22612 ワード

リモートでの使用


プロセス順序


  • サーバスロットの準備
    =>店のドアを開ける->客を待つ(Lister)

  • accept();
    =>お客様と接続されたソケットを取得(socket)
  • 客の到着を待ち続け、客の処理が完了するまで次の客を待つ方式=Blocking方式
  • .
  • には複数の店員がおり、客を待たせずに受け取り続ける方式=Non-Blocking方式

  • ほとんどのサーバは、まずクライアントから情報を送信します(要件)
    クライアントから送信された情報をサーバから読み出す=>InputStream

  • 送信データ=>OutputStream
  • コード練習

  • Server1.Java
  • の作成
    public class Server1 {
        //bad code
        public static void main(String[] args) throws Exception {
    
            //단순히 이거만 있으면 안되고 accept가 필요함
            ServerSocket serverSocket = new ServerSocket(9999);
    
            System.out.println("Ready...");
    
            //누군가 접속될 때까지 멈췄다 실행되는 구조 - Blocked
            for(int i = 0; i < 10; i++) {
                Socket client = serverSocket.accept();
                System.out.println(client);
                //외부에서 연결 들어오면 해당 포트 정보가 찍히는 구조
            }//end for
        }//end main
    }//end class
    クライアントがありませんか?=>そうでなければ、ブラウザはクライアントになります.
  • ブラウザでlocalhost:ポート番号接続時、以下のように
  • 上部addr=/0:0:0:0:0:0:0:1,...このセクションは、ブラウザが接続されていることを示します.

    他の人は、接続時にaddrセクションに接続のIPアドレスをリストします.

    リモート出力


    Server1.Javaの変更
    public class Server1 {
        //bad code
        public static void main(String[] args) throws Exception {
            ServerSocket serverSocket = new ServerSocket(9999);
            System.out.println("Ready...");
    
            for(int i = 0; i < 10; i++) {
                Socket client = serverSocket.accept();
                System.out.println(client);
    
                //읽어오기 => InputStream
                //Scanner에 in으로 읽어온거 스캔
                //nextLine() -> 한 라인만 읽어옴
                InputStream in = client.getInputStream();
                Scanner inScanner = new Scanner(in);
                String line = inScanner.nextLine();
                System.out.println(line);
    
                //클라이언트와 연결된 빨대가 생긴 셈
                OutputStream out = client.getOutputStream();
    
                //보낼 메세지 - html 코드로 작성
                String msg = "<h1>Hello World</h1>";
    
                //out.write(msg.getBytes(StandardCharsets.UTF_8));
                //위의 코드만 작성 시 결과가 제대로 출력되지 않는다
                //Data는 제대로 전송됐는데 왜??
    
                //아래의 4줄 코드로 변경 시 제대로 Hello World가 출력되는 것을 볼 수 있음
                //HTTP에 맞는 전송방식이 아니어서(?) - 브라우저가 읽을 수 없는 코드였기때문에
                out.write(new String("HTTP/1.1 200 OK\r\n").getBytes());
                out.write(new String("Cache-Control: private\r\n").getBytes());
                out.write(new String("Content-Length: "+msg.getBytes("UTF-8").length+"\r\n").getBytes());
                out.write(new String("Content-Type: text/html; charset=UTF-8\r\n\r\n").getBytes());
                
                out.write(msg.getBytes(StandardCharsets.UTF_8));
            }//end for
        }//end main
    }//end class
    Server1.Javaを実行すると、ブラウザは次のように出力されます.

    サーバ側は、送信された最初のローのみが書き込まれているため、requestの最初のローのみが出力されます.


    画像出力

    public class Server2 {
        public static void main(String[] args) throws Exception {
            ServerSocket serverSocket = new ServerSocket(9999);
            System.out.println("Ready...");
    
            for (int i = 0; i < 10; i++) {
                Socket client = serverSocket.accept();
                System.out.println(client);
    
                File file = new File("C:\\zzz\\aaa.jpg");
    
                OutputStream out = client.getOutputStream();
    
                out.write(new String("HTTP/1.1 200 OK\r\n").getBytes());
                out.write(new String("Cache-Control: private\r\n").getBytes());
                out.write(new String("Content-Length: " + file.length() + "\r\n").getBytes());
                out.write(new String("Content-Type: image/jpeg\r\n\r\n").getBytes());
    
                //out.write(new String("Content-Type: text/html; charset=UTF-8\r\n\r\n").getBytes()); -> text/html => error
                
                Files.copy(file.toPath(), out);
            }//end for
        }//end main
    }//end class

    エラー画面


    画像が出力されると、コンテンツタイプがtext/htmlに直接変換されるのではなく画像に変換されると、ブラウザは画像ではなくテキストと判断し、ダッシュを出力する

    ノーマルアウトプット



    コンテンツ-タイプをimage/jpegに変更して画像に一致させ、エラーなく正常に出力します.

    コンテンツ-タイプのタイプ


    =メディアタイプ(Media type)、MIMEタイプ(MIME type)
    1)多部分相関MIMEタイプ
    -コンテンツ-タイプ:複数/関連<-デフォルト形式
    - Content-Type: Application/X-FixedRecord
    2)XMLメディアのタイプ
    - Content-Type: text/xml
    - Content-Type: Application/xml
    - Content-Type: Application/xml-external-parsed-entity
    - Content-Type: Application/xml-dtd
    - Content-Type: Application/mathtml+xml
    - Content-Type: Application/xslt+xml
    3)アプリケーションタイプ
    - Content-Type: Application/EDI-X12 <-- Defined in RFC 1767
    - Content-Type: Application/EDIFACT <-- Defined in RFC 1767
    - Content-Type: Application/javascript <-- Defined in RFC 4329
    -コンテンツタイプ:Application/octet-stream:<-デバッガメディアタイプは、通常、実行可能ファイルとダウンロードオペレーティングシステムを表します.
    - Content-Type: Application/ogg <-- Defined in RFC 3534
    - Content-Type: Application/x-shockwave-flash <-- Adobe Flash files
    - Content-Type: Application/json <-- JavaScript Object Notation JSON; Defined in RFC 4627
    -コンテンツタイプ:Application/x-www-form-urlencode<--HTMLフォーム
    *x-www-form-urlencodeとmultipart/form-dataはフォーム形式ですが、x-www-form-urlencodeは大容量のバイナリデータを効率的に転送できないため、ほとんどの添付ファイルではmultipart/form-dataが使用されています.
    4)オーディオタイプ
    - Content-Type: audio/mpeg <-- MP3 or other MPEG audio
    - Content-Type: audio/x-ms-wma <-- Windows Media Audio;
    - Content-Type: audio/vnd.rn-realaudio <-- RealAudio; などなど.
    5)多部品タイプ
    - Content-Type: multipart/mixed: MIME E-mail;
    - Content-Type: multipart/alternative: MIME E-mail;
    - Content-Type: multipart/related: MIME E-mail <-- Defined in RFC 2387 and used by MHTML(HTML mail)
    -コンテンツタイプ:multipart/formed-data<--添付ファイル
    6)TEXTタイプ
    - Content-Type: text/css
    - Content-Type: text/html
    - Content-Type: text/javascript
    - Content-Type: text/plain
    - Content-Type: text/xml
    7)ファイルタイプ
    - Content-Type: application/msword <-- doc
    - Content-Type: application/pdf <-- pdf
    - Content-Type: application/vnd.ms-excel <-- xls
    - Content-Type: application/x-javascript <-- js
    - Content-Type: application/zip <-- zip
    - Content-Type: image/jpeg <-- jpeg, jpg, jpe
    - Content-Type: text/css <-- css
    - Content-Type: text/html <-- html, htm
    - Content-Type: text/plain <-- txt
    - Content-Type: text/xml <-- xml
    - Content-Type: text/xsl <-- xsl