자바에서 PPTP 연결 만들기
이 기사에서는 Java를 사용하여 PPTP(Point-to-Point Tunneling Protocol) 연결을 만드는 방법을 배웁니다.
PPTP 연결이 필요한 이유
Point-to-Point Tunneling Protocol은 압축 및 암호화된 PPP(Point-to-Point Protocol) 패킷을 인터넷을 통해 전송하기 위한 IP 데이터그램으로 캡슐화하는 데 사용됩니다.
IP 데이터그램은 사설 네트워크와 인터넷에 연결된 지점간 터널링 프로토콜 서버에 도달할 때까지 네트워크를 통해 계속 라우팅됩니다.
PPTP 서버는 IP 데이터그램을 PPP(Point-to-Point Protocol) 패킷으로 분해(분해)하여 개인 네트워크의 네트워크 프로토콜을 통해 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();
}
}
출력:
여기에서 클라이언트는 Is it working?
이라는 메시지를 보냅니다. 서버는 Yes
로 응답합니다.
어떻게? client.java
및 server.java
클래스에서 어떤 일이 발생하는지 이해합시다.
client.java
클래스에서 Socket
이라는 클래스를 사용하여 서버에 연결합니다. Socket
클래스는 IP 주소와 TCP 포트 번호라는 두 가지 매개변수를 사용합니다.
IP 주소는 서버의 주소를 의미합니다. 동일한 시스템에서 두 프로그램(client.java
& server.java
)을 실행하고 있습니다. 그것이 우리가 localhost
를 쓴 이유입니다.
TCP 포트 번호는 서버에서 실행되는 응용 프로그램을 표시합니다.
0
에서 64535
까지의 모든 포트 번호를 사용할 수 있습니다. 이 튜토리얼에서는 5000
을 사용하고 있습니다.
소켓 연결을 통한 통신을 위해 입력 및 출력 모두에 스트림을 사용합니다. 왜요? 양방향 통신(클라이언트 대 서버 및 서버 대 클라이언트)을 구현하고 있습니다.
server.java
클래스에는 두 개의 소켓이 필요합니다. 하나는 클라이언트와의 통신에 사용되는 Socket
클래스의 단순 소켓이고 다른 하나는 클라이언트의 요청을 기다리는 ServerSocket
입니다.
이러한 요청은 클라이언트가 new Socket(IP 주소, 포트 번호)
을 사용하여 Socket
클래스의 새 개체를 만들 때 서버 측에서 수신됩니다.
소켓에서 입력을 수락하기 위해 getInputStream()
함수를 사용하기 전에 accept()
함수는 클라이언트가 서버에 연결할 때까지 차단되고 대기합니다. 여기에서 입력 및 출력 스트림을 사용하여 클라이언트에서 데이터를 가져오고 클라이언트로 데이터를 보냅니다.
질문이 있을 수 있습니다. 클라이언트와 서버에 스트림이 필요한 이유는 무엇입니까? 원시 데이터는 네트워크를 통해 보낼 수 없기 때문입니다.
클라이언트에서 서버로, 서버에서 클라이언트로 통신하려면 데이터를 스트림으로 변환해야 합니다.