创建Java代理MITM
我正在尝试创建一个Java程序作为代理来查看来自传入源的数据包以进行调试。为此,我创建了一个简单的Java服务器应用程序,并在设备上编辑了我的主机文件。到目前为止,一切都运行良好(甚至包括我的中继类文件),但我正在尝试将其变成一个成熟的代理。如何合并元素以将数据发送到服务器,并将响应发送回客户端?有点像一个中间人创建Java代理MITM,java,proxy,man-in-the-middle,Java,Proxy,Man In The Middle,我正在尝试创建一个Java程序作为代理来查看来自传入源的数据包以进行调试。为此,我创建了一个简单的Java服务器应用程序,并在设备上编辑了我的主机文件。到目前为止,一切都运行良好(甚至包括我的中继类文件),但我正在尝试将其变成一个成熟的代理。如何合并元素以将数据发送到服务器,并将响应发送回客户端?有点像一个中间人 import java.net.*; import java.io.*; import org.ini4j.Ini; public class RelayMultiClient ex
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();
}
}
}
谢谢,
克里斯
附言:我不是在尝试获取HTTP数据,我是在尝试从我创建的游戏中获取数据。我不知道这类数据是否需要额外处理
如何合并元素以将数据发送到服务器,并将响应发送回客户端
请尝试以下示例作为基本代理:
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();
}
}
}
它缺乏适当的异常处理,只是演示了基本思想。谢谢您的帮助,但它似乎不起作用。我已经快速设置了另一个java服务器,并尝试像那样连接java代理,并且建立了连接,但没有向该服务器发送任何内容。我假设serverWriter变量不正确。我的和你的一模一样。Writer serverWriter=newoutputstreamwriter(relay.getOutputStream());BufferedReader serverIn=新的BufferedReader(新的InputStreamReader(relay.getInputStream());你说得对,只是我这边的一个输入错误。更正的版本对你有用吗?我已经用你的更正版本更新了我的代码。我的另一个java服务器(不是代理服务器)表示已建立连接,但没有通过serverWriter.write()发送任何内容。谢谢:)!我甚至尝试过直接连接到服务器(而不是代理服务器),而且效果很好。所以这是代理的问题,它必须是服务器和客户端之间的协议,不是基于文本的,而是二进制的。请尝试更新版本,它应该能够处理二进制和文本协议。