1

着信ソースからのパケットを表示してデバッグするためのプロキシとして Java プログラムを作成しようとしています。これを行うために、単純な Java サーバー アプリケーションを作成し、デバイス上のホスト ファイルを編集しました。今のところすべて正常に動作していますが (Relay クラス ファイルも)、本格的なプロキシにしようとしています。データをサーバーに送信し、応答をクライアントに返す要素をどのように組み込むことができますか? 中間者タイプのようなものです。

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();
    }
    }
}

ありがとう、クリス

PS: HTTP データを取得しようとしているのではなく、作成したゲームからデータを取得しようとしています。このタイプのデータに追加の処理が必要かどうかはわかりません。

4

1 に答える 1

3

データをサーバーに送信し、応答をクライアントに返す要素をどのように組み込むことができますか?

基本プロキシとして次の例を試してください。

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();
        }
    }
}

適切な例外処理が欠けており、基本的な考え方を示しているだけです。

于 2013-09-07T19:03:31.160 に答える