リモートでブラウザに出力
22612 ワード
リモートでの使用
プロセス順序
サーバスロットの準備
=>店のドアを開ける->客を待つ(Lister)
accept();
=>お客様と接続されたソケットを取得(socket)
ほとんどのサーバは、まずクライアントから情報を送信します(要件)
クライアントから送信された情報をサーバから読み出す=>InputStream
送信データ=>OutputStream
コード練習
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
クライアントがありませんか?=>そうでなければ、ブラウザはクライアントになります.他の人は、接続時に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
Reference
この問題について(リモートでブラウザに出力), 我々は、より多くの情報をここで見つけました https://velog.io/@hyunn12/원격출력テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol