Java で PPTP 接続を作成する
この記事では、Java を使用して Point-to-Point トンネリングプロトコル(PPTP)接続を作成する方法を学習します。
PPTP 接続が必要な理由
Point-to-Point トンネリングプロトコルは、圧縮および暗号化された Point-to-Point プロトコル(PPP)パケットをインターネット経由で送信するための IP データグラムにカプセル化するために使用されます。
IP データグラムは、プライベートネットワークとインターネットに接続された Point-to-Point トンネリングプロトコルサーバーに到達するまで、ネットワークを介してルーティングを続けます。
PPTP サーバーは、IP データグラムをポイントツーポイントプロトコル(PPP)パケットに分解(分解)し、プライベートネットワークのネットワークプロトコルを介して PPP パケットを復号化します。PPTP でサポートされているプライベートネットワークのネットワークプロトコルは、TCP/IP、NetBEUI、IPX であることを忘れないでください。
このチュートリアルでは、TCP/IP 接続を使用します。それでは、実際の例から始めましょう。
Java で PPTP 接続を作成する
サンプルコード(client.java):
import java.io.*;
import java.net.*;
public class client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 5000);
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
printWriter.println("Is it working?");
printWriter.flush();
InputStreamReader in = new InputStreamReader(socket.getInputStream());
BufferedReader bufferReader = new BufferedReader(in);
String str = bufferReader.readLine();
System.out.println("server : " + str);
}
}
サンプルコード(server.java):
import java.io.*;
import java.net.*;
public class server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new Socket(5000);
Socket socket = serverSocket.accept();
System.out.println("client connected");
InputStreamReader in = new InputStreamReader(socket.getInputStream());
BufferedReader bufferReader = new BufferedReader(in);
String str = bufferReader.readLine();
System.out.println("client : " + str);
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
printWriter.println("Yes");
printWriter.flush();
}
}
出力:

ここで、クライアントは動作していますか?としてメッセージを送信します。サーバーははいで応答します。
どのように?client.java クラスと server.java クラスで何が起こるかを理解しましょう。
client.java クラスでは、Socket という名前のクラスを使用してサーバーに接続します。Socket クラスは、IP アドレスと TCP ポート番号の 2つのパラメーターを取ります。
IP アドレスはサーバーのアドレスを意味します。同じマシンで両方のプログラム(client.java と server.java)を実行しています。そのため、localhost を作成しました。
TCP ポート番号には、サーバーで実行されたアプリケーションが表示されます。
0 から 64535 までの任意のポート番号を使用できます。このチュートリアルでは 5000 を使用しています。
ソケット接続を介した通信の目的で、入力と出力の両方にストリームを使用しています。なんで?双方向通信(クライアントからサーバーおよびサーバーからクライアント)を実装しています。
server.java クラスには、2つのソケットが必要です。1つはクライアントとの通信に使用される Socket クラスの単純なソケットであり、もう 1つはクライアントの要求を待機する ServerSocket です。
これらの要求は、クライアントが new Socket(IP アドレス、ポート番号)を使用して Socket クラスの新しいオブジェクトを作成するときにサーバー側で受信されます。
getInputStream() 関数を使用してソケットからの入力を受け入れる前に、accept() 関数はクライアントがサーバーに接続するまでブロックして待機します。ここでは、入力ストリームと出力ストリームを使用して、クライアントからデータを取得し、クライアントにデータを送信しています。
質問があるかもしれません:なぜクライアントとサーバーにストリームが必要なのですか?これは、生データをネットワーク経由で送信できないためです。
クライアントからサーバーへ、およびサーバーからクライアントへ通信するには、データをストリームに変換する必要があります。
