blog

ServerSocketを使ってB/Sサーバーをシミュレートし、ブラウザを使って自分のローカルウェブページにアクセスする。

BSサーバをシミュレート Webサーバをシミュレートし、ブラウザを使用して、書いたサーバ側のプログラムにアクセスし、Webページの効果を表示します。 HTTPSは、このプロトコルを使用することはできま...

Oct 4, 2020 · 4 min. read
シェア

最近学んだネットワークプログラミングは、演習があります:Webページの効果を表示するには、ブラウザを使用して、自分の書いたサーバー側のプログラムにアクセスするWebサーバーのBacheSサーバーのシミュレーション。つの落とし穴を踏んだ、ということです:

  • HTTPS は、暗号化されているので、このプロトコルを使って、アクセスすることは、できませんが、最初は、IDEA を使っているので、UTF-8 ではないと思い、デフォルトの UTF-8 で、InputStreamReader も使って変換してみましたが、できないことがわかり、ふと、HTTPS が暗号化されていることを思い出し、HTTP で試してみると、うまくいきました!そこで、ふと、HTTPSが暗号化されていることを思い出し、HTTPで試してみました。

注意事項

  • HTTP レスポンスヘッダを固定する必要があります:
  • Googleではご覧になれませんので、他のブラウザでご覧になることをお勧めします。
    // HTTPプロトコルのレスポンスヘッダを書き込む。
     os.write("HTTP/1.1 200 OK
    ".getBytes());
     os.write("Content-タイプ:text/html
    ".getBytes());
     // 空行を書かないとブラウザが解析できない。
     os.write("
    ".getBytes());
    

コードを書くアイデア

  1. クライアント側はウェブサイトですが、サーバー側だけが書かれています。
  2. 1つはクライアントにhtmlコードを送信するため、もう1つはイメージを送信するためです。
  3. 接続を確立するときは、暗号化されているHTTPSプロトコルではなく、HTTPプロトコルを使用する必要があります。
  4. サーバー側の実装手順:
    1. まずServerSocketを作成し、リクエストをリッスンし、受信したらaccept()でキャプチャします。
    2. ネットワーク入力ストリームを使用して、クライアントのリクエスト・ヘッダを読み取り、ファイル・アドレスの Get リクエストを取得します。
    3. 処理アドレス形式
    4. ローカル・ファイル・ストリームを使用して、ファイルを読み取り、クライアントに出力します。
    5. 彼は写真を転送していないため、写真を転送するサーバーの作成では、転送htmlサーバーのコードはほとんど同じですが、違いは、常に要求を聞くために、写真サーバーの転送ということです。
    6. 最適化:転送効率を高速化するためにマルチスレッドを使用します。

以下がそのコードです

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
//"http://localhost:8888"/Advanced/src/Net/BSTCP/web/.html HTTP/1.1
//https、暗号化プロトコルは使えない
public class Server {
 public static void main(String[] args) throws IOException {
 System.out.println("サーバー起動、接続待ち。);
 //サーバーServerSocketを作成し、ポート番号を指定する。
 ServerSocket server = new ServerSocket(8888);
 //acceptメソッドを使用して、要求されたクライアント・オブジェクトを取得する。
 Socket socket = server.accept();
 //ソケットオブジェクトのgetInputStreamメソッドを使用して、ネットワークバイト入力ストリームInputStreamオブジェクトを取得する。
 InputStream is = socket.getInputStream();
 //クライアントのリクエストを出力する
 /*byte[] bytes = new byte;
 int len = is.read(bytes);
 System.out.println(new String(bytes,0,len));
 System.out.println("cao");*/
 //バイトストリームを文字ストリームに変換し、バッファストリームを使って読み込む。
 BufferedReader br = new BufferedReader(new InputStreamReader(is));
 //GETリクエストの最初の行を読む
 String s = br.readLine();
 //スペースで区切る
 String[] s1 = s.split(" ");
 //前の"/"を除外し、文字列インターセプトを使用する。
 String path = s1[1].substring(1);
 System.out.println(path);
 //ローカル・インデックスを読み込むためのfisストリームを作成する。.html 
 FileInputStream fis = new FileInputStream(path);
 //ネットワーク出力ストリームOutputStreamを取得し、ページをクライアントに出力する。
 OutputStream os = socket.getOutputStream();
 // HTTPプロトコルのレスポンスヘッダを書き込む。
 os.write("HTTP/1.1 200 OK
".getBytes());
 os.write("Content-タイプ:text/html
".getBytes());
 // 空行を書かないとブラウザが解析できない。
 os.write("
".getBytes());
 //クライアントへの出力
 byte bytes[] = new byte;
 int len = 0;
 while((len = fis.read(bytes))!=-1){
 os.write(bytes);
 }
 //リソースを閉じる
 fis.close();
 br.close();
 socket.close();
 }
}

フォトサーバー

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class ImageServer {
 public static void main(String[] args) throws IOException {
 System.out.println("サーバー起動、接続待ち。);
 //サーバーServerSocketを作成し、ポート番号を指定する。
 ServerSocket server = new ServerSocket(8888);
 while (true){
 //acceptメソッドを使用して、要求されたクライアント・オブジェクトを取得する。
 Socket socket = server.accept();
 //ソケットオブジェクトのgetInputStreamメソッドを使って、ネットワークバイト入力ストリームInputStreamオブジェクトを取得する。
 InputStream is = socket.getInputStream();
 //クライアントのリクエストを出力する
 /*byte[] bytes = new byte;
 int len = is.read(bytes);
 System.out.println(new String(bytes,0,len));
 System.out.println("cao");*/
 //マルチスレッドで転送を高速化する
 new Thread(new Runnable() {
 @Override
 public void run() {
 try{
 //バイトストリームを文字ストリームに変換し、バッファストリームを使って読み込む。
 BufferedReader br = new BufferedReader(new InputStreamReader(is));
 //GETリクエストの最初の行を読む
 String s = br.readLine();
 //スペースで区切る
 String[] s1 = s.split(" ");
 //前の"/"を除外し、文字列インターセプトを使用する。
 String path = s1[1].substring(1);
 System.out.println(path);
 //ローカル・インデックスを読み込むためのfisストリームを作成する。.html 
 FileInputStream fis = new FileInputStream(path);
 //ネットワーク出力ストリームOutputStreamを取得し、ページをクライアントに出力する。
 OutputStream os = socket.getOutputStream();
 // HTTPプロトコルのレスポンスヘッダを書き込む。
 os.write("HTTP/1.1 200 OK
".getBytes());
 os.write("Content-タイプ:text/html
".getBytes());
 // 空行を書かないとブラウザが解析できない。
 os.write("
".getBytes());
 //クライアントへの出力
 byte bytes[] = new byte;
 int len = 0;
 while((len = fis.read(bytes))!=-1){
 os.write(bytes);
 }
 //リソースを閉じる
 fis.close();
 br.close();
 socket.close();
 }catch (IOException e){
 e.printStackTrace();
 }
 }
 }).start();
 }
 }
}
Read next

HOG特徴記述演算子 - 歩行者検出

このタスクでは、ディープラーニングで非常に人気のある画像特徴抽出技術、Histogram of Orientation Gradients、略してHOG特徴を学習します。HOG特徴は、2005年のCVPRカンファレンスで発表され、画像の手動特徴抽出における画期的なもので、当時、歩行者検出の分野で大きな成功を収めました。...

Oct 4, 2020 · 4 min read