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()
関数はクライアントがサーバーに接続するまでブロックして待機します。ここでは、入力ストリームと出力ストリームを使用して、クライアントからデータを取得し、クライアントにデータを送信しています。
質問があるかもしれません:なぜクライアントとサーバーにストリームが必要なのですか?これは、生データをネットワーク経由で送信できないためです。
クライアントからサーバーへ、およびサーバーからクライアントへ通信するには、データをストリームに変換する必要があります。