- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在为 android 构建一个代理服务器,但遇到了困难。我迫切需要帮助。我对 Android 很陌生。所以,起初,我用 Java SE 制作了代理服务器。代理服务器的工作方式如下:
它监听本地端口,
当客户端连接时,会创建一个新线程。每个线程也有一个名称。
HOST 是从请求中提取的。
然后客户端的请求被转发到远程地址(从主机获取)。
Proxy 然后读取远程服务器的地址,直到找到 -1。
然后将此响应转发给客户端。
代理服务器在笔记本电脑上运行。客户端是安卓手机的Youtube APP。手机已经 root,我已经安装了 ProxyDroid 来告诉客户端代理服务器在哪里。使用 ProxyDroid 的“全局代理”选项。
Java SE 中的代码:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Enumeration;
class clientThread implements Runnable
{
Socket clientSocket = null;//each client socket.
Socket connectYoutubeServerSock = null;//This socket is used to write client's request to the
//YouTube Server.
int videoFlag = 0;//this flag determines whether the GET request is a video request or not.
final int BufferSize = 8019;
public String hostURL;
int youtubePort = 80;
//public DataOutputStream sendClientResponse = null;
public clientThread(Socket clientSocket)
{
this.clientSocket = clientSocket;
}
public void run()
{
System.out.println("Client connected: "+clientSocket.toString());
System.out.println("Current Thread Name: "+Thread.currentThread().getName());
try
{
byte youtubeAppReqArray[] = new byte[BufferSize];//this byte array will house youtube app's request!
InputStream youtubeAppReq = clientSocket.getInputStream();
// reading the request and put it into youtubeAppReqArray.
int bytesRead = youtubeAppReq.read(youtubeAppReqArray,0,BufferSize);
String youtubeAppReqString = new String(youtubeAppReqArray, 0, bytesRead);
System.out.println(youtubeAppReqString);
// extract the url of the GET request!
int gStart = youtubeAppReqString.indexOf("GET: ") + 4;
int gEnd = youtubeAppReqString.indexOf('\n', gStart);
String gURL = youtubeAppReqString.substring(gStart, gEnd - 9);
System.out.println("URL of GET: " + gURL);
//test if videoplayback is there or not?
if(gURL.indexOf("videoplayback") > -1 )
{
System.out.println("This is a video request!");
videoFlag = 1;
}
// extract the host to connect to
int hStart = youtubeAppReqString.indexOf("Host: ") + 6;
int hEnd = youtubeAppReqString.indexOf('\n', hStart);
String host = youtubeAppReqString.substring(hStart, hEnd - 1);
System.out.println("Connecting to host " + host);
//forward the youtube app request from proxy to the youtube server
Socket youtubeServerSocket = new Socket(host, 80);
OutputStream writeToYoutubeServerStream = youtubeServerSocket.getOutputStream();
System.out.println("Forwarding request to server");
writeToYoutubeServerStream.write(youtubeAppReqArray, 0, bytesRead);
writeToYoutubeServerStream.flush();
// forward the response from the server to the browser
byte youtubeServerResArray[] = new byte[BufferSize];//this byte array will house youtube server's response.
InputStream readFromYoutubeServerStream = youtubeServerSocket.getInputStream();
OutputStream writeToYoutubeAppStream = clientSocket.getOutputStream();
System.out.println("Forwarding request from server");
int remoteBytesRead;
do
{
remoteBytesRead = readFromYoutubeServerStream.read(youtubeServerResArray,0,BufferSize);
System.out.println("Receiving " + remoteBytesRead + " bytes");
if (remoteBytesRead > 0)
{
writeToYoutubeAppStream.write(youtubeServerResArray, 0, remoteBytesRead);
String rData = new String(youtubeServerResArray,0,remoteBytesRead);
System.out.println("Remote data: "+rData);
}
} while (remoteBytesRead > 0);
writeToYoutubeAppStream.flush();
youtubeServerSocket.close();
clientSocket.close();
System.out.println("End of communication");
}
catch(IOException ioe)
{
System.out.println("Error"+ioe.getMessage());
}
}
}
public class ChallengeProxy extends IOException
{
public static final int SERVERPORT = 4447;
public static int threadName = 0;
public static void main(String[] args)
{
ChallengeProxy proxyObj = new ChallengeProxy();
proxyObj.knowIP();//get the IP address of the local machine!
try
{
ServerSocket serverSocket = new ServerSocket(SERVERPORT);
System.out.println("Started on: "+SERVERPORT);
while(true)//Non stop listen for clients!
{
Socket clientSocket = serverSocket.accept();//blocks until client is connected!
System.out.println("Client connected: "+clientSocket.toString());
Thread t = new Thread(new clientThread(clientSocket), Integer.toString(threadName));
t.start();
threadName++;
}
}
catch (IOException ioe)
{
System.out.println("Could not listen on port: "+SERVERPORT);
System.out.println("Error"+ioe.getMessage());
}
catch(Exception e)
{
System.out.println("Error"+e.getMessage());
}
}
public void knowIP()
{
try
{
Enumeration e = NetworkInterface.getNetworkInterfaces();
while(e.hasMoreElements())
{
NetworkInterface ni = (NetworkInterface) e.nextElement();
System.out.println("Net interface: "+ni.getName());
Enumeration e2 = ni.getInetAddresses();
while (e2.hasMoreElements())
{
InetAddress ip = (InetAddress) e2.nextElement();
System.out.println("IP address: "+ ip.toString());
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
这正是我想要的。现在,我稍微改造一下代码,让它在 Android 中运行。但是,下面的逻辑是相同的。在这里,当一个新的客户端连接时,也会创建一个新线程。 Youtube APP仍然是客户端。所以现在,YouTube APP 会请求驻留在同一台 Android 机器上的代理服务器。和以前一样,配置 ProxyDroid 以便 YouTube APP 知道我的代理服务器在哪里运行。
Android 的代码看起来像(这段代码在我得到第一个答案后进行了相应的修改,但它并不完整,因为在完成之前代码已经开始出现严重错误!):
public class ChallengeAndroidProxyActivity extends Activity
{
public static final int SERVERPORT = 4453;
public static int threadName = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
(new Thread(new Runnable()
{
public void run()
{
startSocketServer();
}
}
)).start();
}
/*
* Here we will create an infinite loop that will listen
* for client connections.
*
* */
public void startSocketServer()
{
knowIP();// Now we find the IP address of the native machine.
String LOG_TAG = "SocketServerThread";
Log.i(LOG_TAG,"Inside the server thread! ");
try
{
ServerSocket serverSocket = new ServerSocket(SERVERPORT);
Log.i(LOG_TAG, "Started on : " + SERVERPORT);
threadName = 0;
while (true)// Non stop listen for clients!
{
Socket clientSocket = serverSocket.accept();
Log.d(LOG_TAG , "Client connected : " + clientSocket.toString());
Thread t = new Thread(new clientThread(clientSocket), Integer.toString(threadName));
t.start();
threadName++;
}
}
catch (IOException ioe)
{
Log.i(LOG_TAG, "Could not listen on port: " + SERVERPORT);
Log.i(LOG_TAG, "Error : " + ioe.getMessage());
}
catch (Exception e)
{
Log.i(LOG_TAG, "Error : " + e.getMessage());
}
}
class clientThread implements Runnable
{
String LOG_TAG = "clientSocketThread";
Socket clientSocket = null;//each client socket.
Socket connectYoutubeServerSock = null;//This socket is used to write client's request to the
//YouTube Server.
int videoFlag = 0;//this flag determines whether the GET request is a video request or not.
final int BufferSize = 8019;
public String hostURL;
int youtubePort = 80;
public clientThread(Socket clientSocket)
{
this.clientSocket = clientSocket;
}
public void run()
{
Log.i(LOG_TAG,"Client connected: "+clientSocket.toString());
Log.i(LOG_TAG,"Current Thread Name: "+Thread.currentThread().getName());
try
{//1
byte youtubeAppReqArray[] = new byte[BufferSize];//this byte array will house youtube app's request!
InputStream youtubeAppReq = clientSocket.getInputStream();
// reading the request and put it into youtubeAppReqArray.
int bytesRead = youtubeAppReq.read(youtubeAppReqArray,0,BufferSize);
String youtubeAppReqString = new String(youtubeAppReqArray, 0, bytesRead);
Log.i("Youtube App Request: ",youtubeAppReqString);
// extract the host to connect to
int hStart = youtubeAppReqString.indexOf("Host: ") + 6;
int hEnd = youtubeAppReqString.indexOf('\n', hStart);
String host = youtubeAppReqString.substring(hStart, hEnd - 1);
Log.i("Connecting to host ",host);
InetAddress addr = InetAddress.getByName(host);
int port = 80;
SocketAddress sockaddr = new InetSocketAddress(addr, port);
Socket youtubeServerSocket = new Socket();
youtubeServerSocket.connect(sockaddr);
OutputStream writeToYoutubeServerStream = youtubeServerSocket.getOutputStream();
//writeToYoutubeServerStream.write(youtubeAppReqArray, 0, bytesRead);
}//1
catch(IOException ioe)
{//1
Log.i("Error",ioe.getMessage());
}//1
}
}
/************************************************************************************/
public void knowIP()
{
This function just gets the IP of the native machine.
}
}
代码已根据第一个答案建议的更改进行了修改。当代码行
//writeToYoutubeServerStream.write(youtubeAppReqArray, 0, bytesRead);
被注释掉(通过这一行,我的代理将客户端的请求写入远程服务器),我从客户端得到的请求看起来像:
07-19 22:30:16.309: I/ApplicationPackageManager(2843): cscCountry is not German : NEE
07-19 22:30:16.399: I/Net interface:(2843): wlan0
07-19 22:30:16.429: I/IP address:(2843): /192.168.1.129
07-19 22:30:16.429: I/Net interface:(2843): lo
07-19 22:30:16.439: I/IP address:(2843): /127.0.0.1
07-19 22:30:16.439: I/SocketServerThread(2843): Inside the server thread!
07-19 22:30:16.439: I/SocketServerThread(2843): Started on : 4453
07-19 22:30:20.929: D/SocketServerThread(2843): Client connected : Socket[addr=/192.168.1.129,port=44276,localport=4453]
07-19 22:30:20.959: I/clientSocketThread(2843): Client connected: Socket[addr=/192.168.1.129,port=44276,localport=4453]
07-19 22:30:20.959: I/clientSocketThread(2843): Current Thread Name: 0
07-19 22:30:20.969: I/Youtube App Request:(2843): GET http://gdata.youtube.com/feeds/api/users/asadfffx/newsubscriptionvideos?format=2%2C3%2C9&start-index=1&max-results=10&safeSearch=none HTTP/1.1
07-19 22:30:20.969: I/Youtube App Request:(2843): GData-Version: 2
07-19 22:30:20.969: I/Youtube App Request:(2843): X-GData-Device: device-id="AOuj_RqmoX-WkCNNaJKieF2mmwMlkOMFRk7sQsKP_wmdrL1BB1N9V_iVIJAUBkvvyzGdpxWVS83wE7UkGPYjWf0BWvbPa0Uoo0cmgKfxzEqOog8EC-Rm1Wg", data="H1NEdDZ+FuL4U9v3Bx1hlVIAm1s="
07-19 22:30:20.969: I/Youtube App Request:(2843): Authorization: GoogleLogin auth="DQAAAKcAAAC5aU6IN0t6yUkoiU9OmjU8fYjKm1m7MLKleHLhtR-uwCclnZGcKGm-6gYfkjvAGKGXK88dbKnB708CVCQkvJofL6smBXp7TEFj1FqGaRasdOx2iVYrbaTbWtIc8sBaga7v2P1BfctMiSTtEU2HWCqqCiubMvpfspnl9wS284SLgk-Se4jjFsZTo-84la_2wJy_Wmap8OSTdif7JoaxpxYLAWECByrJO50iMTj__6cN3A"
07-19 22:30:20.969: I/Youtube App Request:(2843): Host: gdata.youtube.com
07-19 22:30:20.969: I/Youtube App Request:(2843): User-Agent: Android-YouTube/2
07-19 22:30:20.969: I/Youtube App Request:(2843): Proxy-Connection: close
07-19 22:30:20.969: I/Youtube App Request:(2843): Connection: close
07-19 22:30:20.969: I/Youtube App Request:(2843):
07-19 22:30:20.979: I/Connecting to host(2843): gdata.youtube.com
这是客户端请求的样子。但是当我取消注释以下行时(即它被执行):
writeToYoutubeServerStream.write(youtubeAppReqArray, 0, bytesRead);
一切都崩溃了。特别是,来自 YouTube 应用程序的请求没有任何意义。创建了数百个线程。我的 GET 请求开始看起来像:
07-19 22:36:21.969: I/Youtube App Request:(2916): GData-Version: 2
07-19 22:36:21.969: I/Youtube App Request:(2916): X-GData-Device: device-id="AOuj_RqmoX-WkCNNaJKieF2mmwMlkOMFRk7sQsKP_wmdrL1BB1N9V_iVIJAUBkvvyzGdpxWVS83wE7UkGPYjWf0BWvbPa0Uoo0cmgKfxzEqOog8EC-Rm1Wg", data="H1NEdDZ+FuL4U9v3Bx1hlVIAm1s="
07-19 22:36:21.969: I/Youtube App Request:(2916): Authorization: GoogleLogin auth="DQAAAKcAAAC5aU6IN0t6yUkoiU9OmjU8fYjKm1m7MLKleHLhtR-uwCclnZGcKGm-6gYfkjvAGKGXK88dbKnB708CVCQkvJofL6smBXp7TEFj1FqGaRasdOx2iVYrbaTbWtIc8sBaga7v2P1BfctMiSTtEU2HWCqqCiubMvpfspnl9wS284SLgk-Se4jjFsZTo-84la_2wJy_Wmap8OSTdif7JoaxpxYLAWECByrJO50iMTj__6cN3A"
07-19 22:36:21.969: I/Youtube App Request:(2916): Host: gdat
07-19 22:36:21.969: I/Connecting to host(2916): gdata.youtube.com
07-19 22:36:21.979: D/SocketServerThread(2916): Client connected : Socket[addr=/192.168.1.129,port=55126,localport=4453]
07-19 22:36:21.979: I/clientSocketThread(2916): Client connected: Socket[addr=/192.168.1.129,port=55125,localport=4453]
07-19 22:36:21.979: I/clientSocketThread(2916): Current Thread Name: 463
07-19 22:36:21.979: I/Youtube App Request:(2916): GET http://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.comhttp://gdata.youtube.com/feeds/api/users/asadfffx/newsubscriptionvideos?format=2%2C3%2C9&start-index=1&max-results=10&safeSearch=none HTTP/1.1
07-19 22:36:21.979: I/Youtube App Request:(2916): GData-Version: 2
07-19 22:36:21.979: I/Youtube App Request:(2916): X-GData-Device: device-id="AOuj_RqmoX-WkCNNaJKieF2mmwMlkOMFRk7sQsKP_wmdrL1BB1N9V_iVIJAUBkvvyzGdpxWVS83wE7UkGPYjWf0BWvbPa0Uoo0cmgKfxzEqOog8EC-Rm1Wg", data="H1NEdDZ+FuL4U9v3Bx1hlVIAm1s="
07-19 22:36:21.979: I/Youtube App Request:(2916): Authorization: GoogleLogin auth="DQAAAKcAAAC5aU6IN0t6yUkoiU9OmjU8fYjKm1m7MLKleHLhtR-uwCclnZGcKGm-6gYfkjvAGKGXK88dbKnB708CVCQkvJofL6smBXp7TEFj1FqGaRasdOx2iVYrbaTbWtIc8sBaga7v2P1BfctMiSTtEU2HWCqqCiubMvpfspnl9wS284SLgk-Se4jjFsZTo-84la_2wJy_Wmap8OSTdif7JoaxpxYLAWECByrJO50iMTj__6cN3A"
07-19 22:36:21.979: I/Youtube App Request:(2916): Host: gdata.youtube.com
为什么 GET 请求看起来像这样?我的猜测是,线程有问题。创建套接字,读/写线程安全吗?代码是否在线程间跳转?我究竟做错了什么?相同的代码适用于 Java SE;那么为什么它在 Android 中崩溃了呢?
我们将不胜感激任何建议、评论和代码 fragment 。
最佳答案
您不应在 Activity 的 onCreate() 方法中运行服务器循环,因为您会阻塞 UI 线程。启动运行套接字服务器的另一个线程。在 onCreate()、onStart() 和 onResume() 方法完成之前,您的应用程序不会被视为正在运行。如果您在 onCreate() 中阻塞,您的应用程序将永远不会启动。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
(new Thread(new Runnable() {
public void run() {
startSocketServer();
}
})).start();
}
private void startSocketServer() {
final String LOG_TAG = "SocketServerThread";
knowIP();
try {
ServerSocket serverSocket = new ServerSocket(SERVERPORT);
Log.i(LOG_TAG, "Started on : " + SERVERPORT);
while (true)// Non stop listen for clients!
{
Socket clientSocket = serverSocket.accept();!
Log.d(LOG_TAG , "Client connected : " + clientSocket.toString());
Thread t = new Thread(new clientThread(clientSocket),
Integer.toString(threadName));
t.start();
threadName++;
}
} catch (IOException ioe) {
Log.i(LOG_TAG, "Could not listen on port: " + SERVERPORT);
Log.i(LOG_TAG, "Error : " + ioe.getMessage());
} catch (Exception e) {
Log.i(LOG_TAG, "Error : " + e.getMessage());
}
}
阅读 Android 应用程序生命周期 http://developer.android.com/reference/android/app/Activity.html
您还可以考虑将套接字服务器作为服务运行。 http://developer.android.com/guide/components/services.html
关于android - 迫切需要帮助构建 Android 代理服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11548939/
我完全不同意配置代理来检查我正在开发的应用程序的 HTTP(S) 流量。我试过运行 Fiddler2 和 Charles Web Proxy,它们都在 127.0.0.1:888 上运行,并使用以下参
我有一个 AWS 环境,其中有几个实例没有预安装 SSM 代理,也没有 key 对,有没有办法在不使用 SSH 登录我的实例的情况下安装 SSM 代理? 在此先感谢您的帮助! 最佳答案 没有。这是一个
在本教程中,您将借助示例了解 JavaScript 代理。 在 JavaScript 中,proxy(代理对象)用于包装对象并将各种操作重新定义到对象中,例如读取、插入、验证等。代理允许您向对
我有一个基于 Martini 的小型应用程序,但遇到了一个我无法解决的问题。 我想添加一个应用程序功能,允许用户从第三个服务器获取文件,并在 HTTP header 中进行一些更改。某种代理。这些文件
结构对比 讲实话,博主当初学习完整设计模式时,这三种设计模式单独摘哪一种都是十分清晰和明确的,但是随着模式种类的增加,在实际使用的时候竟然会出现恍惚,例如读开源代码时,遇到不以模式命名规范的代码时,
我正在尝试代理运行 ELK 的后端服务器。这是我的环境信息: root@proxy:~# root@proxy:~# cat /etc/*release DISTRIB_ID=Ubuntu DISTR
我需要为我的 java 应用程序编写一个代理,它在每个数组创建时执行一些特定的操作。到目前为止,我无法找到在此事件上运行我的代码的任何方法。 java.lang.instrument.ClassFil
PHP 代理如何工作? 我希望制作一个类似于其他 php 代理的小脚本 但是它实际上是如何工作的呢? 最佳答案 我正在考虑一个 PHP 代理,用于绕过 AJAX Sane Origin 策略。如果您需
我有一个 Electron 应用程序,试图通过该应用程序从同一网络调用url,但是出于安全考虑,我考虑了使用代理的想法。 function createWindow () { const mai
我有 1 台计算机,安装了 1 个网卡。网卡有 10 个 IP 地址分配给它。我在那里运行了一个 Windows 桌面应用程序。该应用程序基本上是一个调用 1 个特定网站的网络浏览器。 我想要实现的是
我想将 Burp 配置为我的 java 代码的代理,以查看请求和响应。Burp 作为 Web 浏览器之间的代理可以很好地工作,但它不适用于 Java 应用程序。 我已经在代码中添加了这样的行: Web
据我所知,在Spring AOP中,当我们想要拦截某些方法调用时,我们会配置一个具有与所需方法调用相匹配的切入点配置的Aspect。也就是说,我们在Aspect端配置拦截。 有没有一种方法可以完全从相
这可能是一个常见问题,但是:我有一个正在向 发出请求的应用程序elldmess.cz/api/... 但是这个api已经没有了。 现在我想要“东西”,即 catch 对 elldmess.cz/api
我正在尝试在 Android 中创建代理,但我必须使用套接字。我已经阅读了很多教程并提出了以下代码。不幸的是,浏览器似乎没有获得任何数据,一段时间后它显示标准网页,说网页不可用。可能是什么原因?感谢您
我在使用此代码时遇到了一些问题,具体取决于我使用的浏览器,有些 URL 在 IE 中显示正确,但在 Firefox 中显示为纯文本(例如 www.microsoft.es 在 IE 上看起来不错,但在
我正在尝试通过 urllib 获取一些 url 并通过我的代理进行 Mechanize 。 使用 mechanize 我尝试以下操作: from mechanize import Browser im
我安装了一个嵌入式设备(光伏转换器),它提供了一个正常的 http Web 界面(信息和设置)。该转换器具有用户身份验证,但只能通过 http 进行。出于安全考虑,我不想将服务器直接发布到互联网上。在
我正在搜索有关如何使用支持 HTTPS 的 Ruby 编写代理的一些示例。我有一个使用 Webricks HTTPProxyServer 实现的简单代理,但我注意到,HTTPS 流量只是隧道传输(它应
我的一位客户刚收到他选择的开发商订购的软件,让我看一下并准备托管程序。 这是一个 Java (jar) 应用程序,到目前为止一切顺利......但我看到了一些可疑的东西,软件每隔 60 分钟左右连接到
我试图在 C# 中创建一个 HTTPS 代理服务器。这里有人发布了解决方案: string host = "encrypted.google.com"; string
我是一名优秀的程序员,十分优秀!