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