Edited at

Javaでサーバー処理(入門part.1)

More than 1 year has passed since last update.


Javaでサーバーの勉強


目標


  1. サーバーの基礎のおさらいらい


    1. 自分のパソコン内で、アクセスしてきたクライアントに文字列を返すサーバーを起動する

    2. 自分のパソコン内でクライアントとしてサーバーにアクセスし、文字列を受け取る

    3. クライアントから送信されてきた文字列を表示する機能をサーバーに追加

    4. 文字列を送信する機能をクライアントに追加



  2. 入力文字列をサーバー側で表示表示

  3. クライアントのIPアドレスをサーバー側で表示する

  4. クライアントから文字列が送られてきた時刻を表示する

  5. クライアント側から文字列が送られてきたら、何番目にアクセスしてきたクライアントかをサーバー内で記憶させて表示させる(サーバー起動時にカウンタを0にする。)

  6. クライアントからサーバーに送る文字列を複数行にする

  7. サーバーからクライアントに送る文字列を複数行にする


本編


1. サーバーの基礎のおさらいらい


1. 自分のパソコン内で、クライアント側に文字列を表示するサーバーを起動する

以下のファイルを作成作成


basic01Server.java

import java.io.PrintWriter;

import java.net.ServerSocket;
import java.net.Socket;
public class basic01Server {
public static void main(String[] args) {
try{
ServerSocket server = new ServerSocket(3838, 5);
while(true){
System.out.println("サーバーは稼働しています。");
Socket socket = server.accept();
PrintWriter output = new PrintWriter(socket.getOutputStream());
output.println("こんにちは!こちらはサーバーです!");
output.close(); // PrintWriterはclose()で閉じるのが基本
socket.close(); // Socketはclose()で閉じるのが基本
}
} catch (Exception e){
System.out.println(e);
}
}
}

コンパイルして、起動する。


2. 自分のパソコン内でクライアントとしてサーバーにアクセスし、文字列を受け取る

以下のファイルを作成


basic01Client.java

import java.net.Socket;

import java.util.Scanner;
public class basic01Client {
public static void main(String[] args) {
try{
Socket socket = new Socket("127.0.0.1", 3838); // localhost server を使用
Scanner input = new Scanner(socket.getInputStream());
System.out.println("サーバーからのメッセージは「" + input.nextLine() + "」");
input.close(); // Scannerはclose()で閉じるのが基本
socket.close(); // Socketはclose()で閉じるのが基本
} catch (Exception e){
System.out.println(e);
}
}
}


実行してみよう


3. クライアントから送信されてきた文字列を表示する機能をサーバーに追加


basic01Server02.java

import java.io.PrintWriter;

import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner; // 追加
public class basic01Server02 {
public static void main(String[] args) {
try{
ServerSocket server = new ServerSocket(3838, 5);
while(true){
System.out.println("サーバーは稼働しています。");
Socket socket = server.accept();
Scanner input = new Scanner(socket.getInputStream()); // 追加:クライアントから受け取った文字列を格納
System.out.println("クライアントから送られてきたメッセージは「" + input.nextLine() + "」です"); // 追加:格納した文字列を出力
PrintWriter output = new PrintWriter(socket.getOutputStream());
output.println("こんにちは!こちらはサーバーです!");
output.close();
socket.close();
}
} catch (Exception e){
System.out.println(e);
}
}
}


まだ、実行はしない


4. 文字列を送信する機能をクライアントに追加


basic01Client02.java

import java.net.Socket;

import java.util.Scanner;
import java.io.PrintWriter; // add
import java.io.*; // add
public class basic01Client02 {
public static void main(String[] args) {
try{
Socket socket = new Socket("127.0.0.1", 3838);
PrintWriter output = new PrintWriter(socket.getOutputStream()); // add
output.println("クライアントから文字列を送信"); // add
output.flush();
Scanner input = new Scanner(socket.getInputStream());
System.out.println("サーバーからのメッセージは「" + input.nextLine() + "」");
input.close();
output.close(); // add
socket.close();
} catch (Exception e){
System.out.println(e);
}
}
}


実行してみよう


2. 入力文字列をサーバー側で表示

クライアント側のファイルを書き換える。


basic02Client.java

import java.io.BufferedReader;

import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class basic02Client {
public static void main(String args[]){
try{
Socket socket = new Socket("127.0.0.1", 3838);
PrintWriter output = new PrintWriter(socket.getOutputStream());
BufferedReader consoleIn = new BufferedReader( new InputStreamReader(System.in) ); // add
String consoleInStr = consoleIn.readLine(); // add
//output.println("----"); // remove
output.println(consoleInStr); // add
output.flush();
Scanner input = new Scanner(socket.getInputStream());
System.out.println(input.nextLine());
input.close();
output.close();
socket.close();
} catch(Exception e){
System.out.println(e);
}
}
}


参考:Java キーボードから文字列を入力する


3. クライアントのIPアドレスをサーバー側で表示するする


basic03Server.java

import java.io.PrintWriter;

import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class basic03Server {
public static void main(String[] args) {
try{
ServerSocket server = new ServerSocket(3838, 5);
while(true){
System.out.println("サーバーは稼働しています。");
Socket socket = server.accept();
Scanner input = new Scanner(socket.getInputStream());
System.out.println("クライアントから送られてきたメッセージは「" + input.nextLine() + "」です");
String clientIpAddress = socket.getRemoteSocketAddress().toString(); // add:1
System.out.println( "クライアントのIPアドレスとport番号は「" + clientIpAddress + "」"); // add
String clientIpAddr = socket.getInetAddress().getHostAddress().toString(); // add:2
System.out.println( "クライアントのIPアドレスとport番号は「" + clientIpAddr + "」"); // add
PrintWriter output = new PrintWriter(socket.getOutputStream());
output.println("こんにちは!こちらはサーバーです!");
output.close();
socket.close();
}
} catch (Exception e){
System.out.println(e);
}
}
}

参考:How to find the IP Address of Client connected to Server? - stack overflow


4. クライアントから文字列が送られてきた時刻を表示する


basic04Server.java

import java.io.PrintWriter;

import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.Date;
public class basic04Server {
public static void main(String[] args) {
try{
ServerSocket server = new ServerSocket(3838, 5);
while(true){
System.out.println("サーバーは稼働しています。");
Socket socket = server.accept();
Scanner input = new Scanner(socket.getInputStream());
System.out.println("クライアントから送られてきたメッセージは「" + input.nextLine() + "」です");
String clientIpAddress = socket.getRemoteSocketAddress().toString();
System.out.println( "クライアントのIPアドレスとport番号は「" + clientIpAddress + "」");
String clientIpAddr = socket.getInetAddress().getHostAddress().toString();
System.out.println( "クライアントのIPアドレスとport番号は「" + clientIpAddr + "」");
Date time = new Date(); // add
System.out.println( "時刻:「" + time + "」"); // add
PrintWriter output = new PrintWriter(socket.getOutputStream());
output.println("こんにちは!こちらはサーバーです!");
output.close();
socket.close();
}
} catch (Exception e){
System.out.println(e);
}
}
}


5. クライアント側から文字列が送られてきたら、何番目にアクセスしてきたクライアントかをサーバー内で記憶させて表示させる(サーバー起動時にカウンタを0にする。)


basic05Server.java

import java.io.PrintWriter;

import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.Date;
public class basic05Server {
public static void main(String[] args) {
try{
ServerSocket server = new ServerSocket(3838, 5);
int order = 0; // add
while(true){
System.out.println("サーバーは稼働しています。");
Socket socket = server.accept();
order += 1; // add
Scanner input = new Scanner(socket.getInputStream());
System.out.println("クライアントから送られてきたメッセージは「" + input.nextLine() + "」です");
String clientIpAddress = socket.getRemoteSocketAddress().toString();
System.out.println( "クライアントのIPアドレスとport番号は「" + clientIpAddress + "」");
String clientIpAddr = socket.getInetAddress().getHostAddress().toString();
System.out.println( "クライアントのIPアドレスとport番号は「" + clientIpAddr + "」");
Date time = new Date();
System.out.println( "時刻:「" + time + "」");
System.out.println( "このクライアントは「" + order + "」番目です。");
PrintWriter output = new PrintWriter(socket.getOutputStream());
output.println("こんにちは!こちらはサーバーです!");
output.close();
socket.close();
}
} catch (Exception e){
System.out.println(e);
}
}
}


6. クライアントからサーバーに送る文字列を複数行にする


basic06Server.java

import java.io.PrintWriter;

import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.Date;
public class basic06Server {
public static void main(String[] args) {
try{
ServerSocket server = new ServerSocket(3838, 5);
int order = 0; // add
while(true){
System.out.println("サーバーは稼働しています。");
Socket socket = server.accept();
order += 1; // add
Scanner input = new Scanner(socket.getInputStream());
System.out.println("クライアントから送られてきたメッセージは「"); // change
String getString = input.nextLine();
while(!getString.equals("QUIT")){ // change:"QUIT"の文字列が来たら終了
System.out.println(getString); // change
getString = input.nextLine(); // add
}
System.out.println("」です"); // change
String clientIpAddress = socket.getRemoteSocketAddress().toString();
System.out.println( "クライアントのIPアドレスとport番号は「" + clientIpAddress + "」");
String clientIpAddr = socket.getInetAddress().getHostAddress().toString();
System.out.println( "クライアントのIPアドレスとport番号は「" + clientIpAddr + "」");
Date time = new Date();
System.out.println( "時刻:「" + time + "」");
System.out.println( "このクライアントは「" + order + "」番目です。");
PrintWriter output = new PrintWriter(socket.getOutputStream());
output.println("こんにちは!こちらはサーバーです!");
output.close();
socket.close();
}
} catch (Exception e){
System.out.println(e);
}
}
}


basic06Client.java

import java.io.BufferedReader;

import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class basic06Client {
public static void main(String args[]){
try{
Socket socket = new Socket("127.0.0.1", 3838);
PrintWriter output = new PrintWriter(socket.getOutputStream());
BufferedReader consoleIn = new BufferedReader( new InputStreamReader(System.in) );
//String consoleInStr = consoleIn.readLine(); // remove
String consoleInStr = ""; // add
while(!consoleInStr.equals("QUIT")){ // change:"QUIT"と入力すると終了
consoleInStr = consoleIn.readLine();
output.println(consoleInStr);
output.flush();
}
Scanner input = new Scanner(socket.getInputStream());
System.out.println(input.nextLine());
input.close();
output.close();
socket.close();
} catch(Exception e){
System.out.println(e);
}
}
}

参考:文字列と文字列の比較


7. サーバーからクライアントに送る文字列を複数行にする


basic07Server.java

import java.io.PrintWriter;

import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.Date;
public class basic07Server {
public static void main(String[] args) {
try{
ServerSocket server = new ServerSocket(3838, 5);
int order = 0; // add
while(true){
System.out.println("サーバーは稼働しています。");
Socket socket = server.accept();
order += 1; // add
Scanner input = new Scanner(socket.getInputStream());
System.out.println("クライアントから送られてきたメッセージは「");
String getString = input.nextLine();
while(!getString.equals("QUIT")){
System.out.println(getString);
getString = input.nextLine();
}
System.out.println("」です");
String clientIpAddress = socket.getRemoteSocketAddress().toString();
System.out.println( "クライアントのIPアドレスとport番号は「" + clientIpAddress + "」");
String clientIpAddr = socket.getInetAddress().getHostAddress().toString();
System.out.println( "クライアントのIPアドレスとport番号は「" + clientIpAddr + "」");
Date time = new Date();
System.out.println( "時刻:「" + time + "」");
System.out.println( "このクライアントは「" + order + "」番目です。");
PrintWriter output = new PrintWriter(socket.getOutputStream());
// クライアントにかえすメッセージを複数にする
output.println( "START SERVER MESSAGE"); // add
output.println( "-------------------------------"); // add
output.println( "こんにちは!" ); // add
output.println( "こちらはサーバーです。" ); // add
output.println( "複数行の文字列を送ります。"); // add
output.println( "-------------------------------"); // add
output.println( "END SERVER MESSAGE"); // add
//output.println("こんにちは!こちらはサーバーです!"); // remove
output.close();
socket.close();
}
} catch (Exception e){
System.out.println(e);
}
}
}


basic07Client.java

import java.io.BufferedReader;

import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class basic07Client {
public static void main(String args[]){
try{
Socket socket = new Socket("127.0.0.1", 3838);
PrintWriter output = new PrintWriter(socket.getOutputStream());
BufferedReader consoleIn = new BufferedReader( new InputStreamReader(System.in) );
String consoleInStr = "";
while(!consoleInStr.equals("QUIT")){
consoleInStr = consoleIn.readLine();
output.println(consoleInStr);
output.flush();
}
Scanner input = new Scanner(socket.getInputStream());
String serverMessage = ""; // add
while(!serverMessage.equals("END SERVER MESSAGE")){ // add
serverMessage = input.nextLine(); // add
System.out.println(serverMessage); // add
} // add
input.close();
output.close();
socket.close();
} catch(Exception e){
System.out.println(e);
}
}
}