import java.net.*; import java.io.*; import java.util.*; public class DaytimeServer { static int port = 10013; public static void main(String[] args) { try { ServerSocket server = new ServerSocket(port); Socket sock = null; System.out.println("Server Ready"); while(true) { try { sock = server.accept(); // クライアントからの接続を待つ System.out.println("Connected"); BufferedReader in = new BufferedReader( new InputStreamReader(sock.getInputStream())); PrintWriter out = new PrintWriter(sock.getOutputStream()); Date d = new Date(); out.print(d + "\r\n"); out.flush(); sock.close(); // クライアントからの接続を切断 System.out.println("Connection Closed"); } catch (IOException e) { System.err.println(e); } } } catch (IOException e) { System.err.println(e); } } }
import java.net.*; import java.io.*; public class ReversingEchoServer { static int port = 10007; public static void main(String[] args) { try { ServerSocket server = new ServerSocket(port); Socket sock = null; System.out.println("Server Ready"); while(true) { try { sock = server.accept(); // クライアントからの接続を待つ System.out.println("Connected"); BufferedReader in = new BufferedReader( new InputStreamReader(sock.getInputStream())); PrintWriter out = new PrintWriter(sock.getOutputStream()); String s, t; while((s = in.readLine()) != null) { // 一行受信 t = ""; for (int i = s.length()-1; i >= 0; i--) { t += s.charAt(i); // 逆順にして1文字づつtに追加 } out.print(t + "\r\n"); // 一行送信 out.flush(); System.out.println(t); } sock.close(); // クライアントからの接続を切断 System.out.println("Connection Closed"); } catch (IOException e) { System.err.println(e); } } } catch (IOException e) { System.err.println(e); } } }
import java.net.*; import java.io.*; public class AlphabetReversingEchoServer { static int port = 10007; public static void main(String[] args) { try { ServerSocket server = new ServerSocket(port); Socket sock = null; System.out.println("Server Ready"); while(true) { try { sock = server.accept(); // クライアントからの接続を待つ System.out.println("Connected"); BufferedReader in = new BufferedReader( new InputStreamReader(sock.getInputStream())); PrintWriter out = new PrintWriter(sock.getOutputStream()); String s, t; while((s = in.readLine()) != null) { // 一行受信 t = ""; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c >= 'A' && c <= 'Z') { // 大文字の場合 t += (char)(c + 'a' - 'A'); // 小文字に変換 } else if (c >= 'a' && c <= 'z') { // 小文字の場合 t += (char)(c + 'A' - 'a'); // 大文字に変換 } else { // その他 t += c; // 変換しない } } out.print(t + "\r\n"); // 一行送信 out.flush(); System.out.println(t); } sock.close(); // クライアントからの接続を切断 System.out.println("Connection Closed"); } catch (IOException e) { System.err.println(e); } } } catch (IOException e) { System.err.println(e); } } }
※ アルファベットを変換する際にchar型へのキャストを行なっている。 これを行わないとint型と解釈され、文字コード値が結果として出力されてしま う。
import java.net.*; import java.io.*; import java.util.*; public class DateWebServer { static int port = 10080; public static void main(String[] args) { try { ServerSocket server = new ServerSocket(port); Socket sock = null; String[] html_body = { "<html><head>", "<title>Show Date</title>", "</head>", "<body>", "<h1>", "", "</h1>", "</body>", "</html>"}; int content_length = 0; int i; for (i = 0; i < html_body.length; i++) { content_length += html_body[i].length() + 2; } System.out.println("*** Server Ready ***"); while(true) { try { sock = server.accept(); System.out.println("*** Connected ***"); boolean connected = true; BufferedReader in = new BufferedReader( new InputStreamReader(sock.getInputStream())); PrintWriter out = new PrintWriter(sock.getOutputStream()); String s; while(true) { s = in.readLine(); if (s == null) { out.print("HTTP/1.1 400 Bad Request\r\n"); out.flush(); connected = false; break; } if (s.equals("")) break; System.out.println(s); } if (connected) { Date d = new Date(); html_body[5] = d.toString(); out.print("HTTP/1.0 200 OK\r\n"); out.print("Server: Simple Java Web Server \r\n"); out.print("Content-length: " + (content_length + html_body[5].length()) + "\r\n"); out.print("Content-Type: text/html\r\n"); out.print("\r\n"); for (i = 0; i < html_body.length; i++) { out.print(html_body[i] + "\r\n"); } out.flush(); } sock.close(); System.out.println("*** Connection Closed ***"); } catch (IOException e) { System.err.println(e); } } } catch (IOException e) { System.err.println(e); } } }
※ html_body[5]を最初は空にして、バイト数を数え、 HTTPレスポンスを返す時に、html_body[5]に日時の文字列を代入している。 Content-lengthヘッダを出力する際に事前に数えたバイト数と、 現在のhtml_body[5]のバイト数を足すことで全体のバイト数を求めている。
※ html_body[5] = d.toString() として、 Dateオブジェクトを文字列に変換している。 勧められないが、 html_body[5] = "" + d としても 正常に動作する。空の文字列"" に dを追加する場合に、自動的にtoString() が呼ばれて、文字列に変換されるからである。
String host = "www.rsch.tuis.ac.jp"; String path = "/~ohmi/software-basic/network-test.html";
以上のhostとpathに代入している内容を修正することになる。実行結果は省略する。
String from = "s03888xx@edu.tuis.ac.jp"; String to = "s03999yy@edu.tuis.ac.jp";
以上のfromとtoに代入している内容を修正することになる。 実行結果は省略する。
import java.net.*; import java.io.*; import java.util.*; public class LoggedWebServer { static int port = 10080; public static void main(String[] args) { try { ServerSocket server = new ServerSocket(port); Socket sock = null; String[] html_body = { "<html><head>", "<title>Network test</title>", "</head>", "<body>", "<h1>Network test page</h1>", "<address>joho-taro@hogehoge.tuis.ac.jp</address>", "</body>", "</html>"}; // 送信するHTMLの内容 final String log_filename = "access_log"; int content_length = 0; int i; // HTMLの内容のバイト数を数える for (i = 0; i < html_body.length; i++) { content_length += html_body[i].length() + 2; } PrintWriter log = new PrintWriter(new FileWriter(log_filename)); System.out.println("*** Server Ready ***"); while(true) { try { sock = server.accept(); // 接続を待つ System.out.println("*** Connected ***"); boolean connected = true; // まだ接続中かどうか? BufferedReader in = new BufferedReader( new InputStreamReader(sock.getInputStream())); PrintWriter out = new PrintWriter(sock.getOutputStream()); String s; // HTTPリクエストを受信する s = in.readLine(); if (s == null || !s.startsWith("GET")) { // ソケットが切断された もしくは GETメソッドでない out.print("HTTP/1.1 400 Bad Request\r\n"); out.flush(); connected = false; } else { StringTokenizer st = new StringTokenizer(s, " "); st.nextToken(); String path = st.nextToken(); String ver = st.nextToken(); log.println(sock.getInetAddress() + " " + path + " " + ver); log.flush(); } while(connected) { s = in.readLine(); if (s.equals("")) break; // 空行に到達した System.out.println(s); } // HTTPレスポンスを返す if (connected) { // HTTPステータス行の送信 out.print("HTTP/1.1 200 OK\r\n"); // HTTPヘッダ部の送信 out.print("Server: Simple Java Web Server \r\n"); out.print("Content-Length: " + content_length + "\r\n"); out.print("Connection: close\r\n"); out.print("Content-Type: text/html\r\n"); // 空行(ヘッダ部終了)の送信 out.print("\r\n"); // 本文(この場合HTML)の送信 for (i = 0; i < html_body.length; i++) { out.print(html_body[i] + "\r\n"); } out.flush(); } sock.close(); // ソケットを切断する System.out.println("*** Connection Closed ***"); } catch (IOException e) { System.err.println(e); } } } catch (IOException e) { System.err.println(e); } } }