2013-09-07 3 views
1

들어오는 소스에서 디버깅 할 패킷을보기 위해 프록시로 Java 프로그램을 만들려고합니다. 이렇게하기 위해 간단한 Java 서버 응용 프로그램을 만들고 장치에서 호스트 파일을 편집했습니다. 모든 것이 이제는 잘 작동하지만 (심지어 내 릴레이 클래스 파일) 완전한 프록시로 만들기 위해 노력하고 있습니다. 요소를 통합하여 서버에 데이터를 보내고 응답을 클라이언트에 다시 보낼 수 있습니까? Man-In-The-Middle 유형의 것 같습니다.자바 프록시 MITM 만들기

import java.net.*; 
import java.io.*; 
import org.ini4j.Ini; 

public class RelayMultiClient extends Thread { 
    private Socket socket = null; 
    Socket relay = null; 

    public RelayMultiClient(Socket socket) { 
    super("RelayMultiClient"); 
    this.socket = socket; 
    } 

    public void run() { 

    try { 
     PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
     BufferedReader in = new BufferedReader(
        new InputStreamReader(
        socket.getInputStream())); 
     if(Relay.max_clients == Relay.connected_clients) { 
      //There are too many clients on the server. 
      System.out.println("Connection refused from " + socket.getRemoteSocketAddress() + ": Too many clients connected!"); 
      out.close(); 
      in.close(); 
      socket.close(); 
     } 
     else { 
      Ini ini = new Ini(new File("settings.ini")); 
      Relay.connected_clients++; 
      System.out.println("Connection from client " + socket.getRemoteSocketAddress() + " established. Clients Connected: " + Relay.connected_clients); 
      while (in.readLine() != null) { 
       //Send data to the server 
       //Receive data from server and send back to client 
      } 
      System.out.println("Connection from client " + socket.getRemoteSocketAddress() + " lost."); 
      Relay.connected_clients--; 
      out.close(); 
      in.close(); 
      socket.close(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

감사합니다, 크리스

P.S : 나는 내가 만든 게임에서 데이터를 얻기 위해 노력하고, HTTP 데이터를 얻기 위해 시도하고 있지 않다. 이러한 유형의 데이터에 추가 처리가 필요한지 여부는 알 수 없습니다.

답변

2

요소를 통합하여 서버에 데이터를 보내고 클라이언트에 응답을 다시 보낼 수 있습니까?

기본 프록시 다음 예를보십시오 : 그것은 단지 기본 개념을 보여주는 적절한 예외 처리 부족

public class Proxy { 
public static void main(String[] args) throws IOException { 
    ServerSocket serverSocket = new ServerSocket(1230); // proxy port 
    Socket socket = serverSocket.accept(); 
    Socket relay = new Socket("localhost", 1234); // server address 
    new ProxyThread(relay.getInputStream(), socket.getOutputStream()).start(); 
    new ProxyThread(socket.getInputStream(), relay.getOutputStream()).start(); 
} 
} 

class ProxyThread extends Thread { 
    private InputStream inputStream; 
    private OutputStream outputStream; 

ProxyThread(InputStream inputStream, OutputStream outputStream) { 
    this.inputStream = inputStream; 
    this.outputStream = outputStream; 
} 

public void run() { 
    try { 
     int i; 
     while ((i = inputStream.read()) != -1){ 
      outputStream.write(i); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
} 

.

+0

도움 주셔서 감사합니다. 그러나 작동하지 않는 것 같습니다. 다른 Java 서버를 신속하게 설정하고 java 프록시와 연결하려고 시도했지만 연결은 이루어졌지만 아무 것도 해당 서버로 보내지 않습니다. serverWriter 변수가 올바르지 않다고 가정합니다. 나는 네가 가진 것과 똑같이 가지고있다. 라이터 serverWriter = new OutputStreamWriter (relay.getOutputStream()); BufferedReader serverIn = 새 BufferedReader (새 InputStreamReader (relay.getInputStream())); – baseman101

+0

네 말이 맞아, 내 편이라. 수정 된 버전이 효과가 있습니까? – Jk1

+0

수정 된 버전으로 내 코드를 업데이트했습니다. 다른 java 서버 (프록시가 아님)는 serverWriter.write()를 통해 아무 것도 전송되지 않고 연결이되었다고 말합니다. 감사 :)! – baseman101