【发布时间】:2016-10-09 20:57:10
【问题描述】:
我对使用套接字进行编码真的很陌生。
我喜欢 socket 库,我了解了我的程序中发生的大部分事情,所以我不介意我想坚持下去。
正如标题所说,我有一个基于套接字的客户端和服务器,我想通过 HTTP 代理交换内容(我使用的是 Squid 代理)。这段小代码应该绕过我校园中的代理来模拟校园网络上的聊天。这是完全合法的,因为我询问了在那里工作的 IT 人员。
这是交易,我可以通过代理向我的服务器发送一个 POST 请求,该服务器接收它并将其发送回客户端 1,但是当我尝试向代理发送更多请求时,它们都没有到达服务器所以我认为连接已断开,但问题是,当我从直接连接到服务器的客户端 2 发送消息时,服务器和客户端 1 会接收它们。
import socket
from _thread import *
def sender(server,h):
b=input("<<--Send--")
b=h
server.send(b.encode())
PROXY_IP="127.0.0.1"
PROXY_PORT=3128
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.settimeout(0.05)
server.connect((PROXY_IP,PROXY_PORT))
header="""POST http://127.0.0.1:3001 HTTP/1.1\r\n
Host: 127.0.0.1:3001\r\n
Proxy-Connection: keep-alive\r\n
Content-Length: 5 \r\n\r\n
hello\r\n"""
server.send(header.encode())
while 1:
try:
start_new_thread(sender,(server,header))
a=server.recv(1024)
print("-->>{}".format(a.decode()))
except KeyboardInterrupt:
break
except:
pass
server.close()
我已经尝试过完美运行的 CONNECT 方法,但在我的校园网络代理中不允许使用它。 我究竟做错了什么 ? 关于如何通过代理重新发送内容,我应该知道些什么? 感谢您的宝贵时间,请多多包涵。
这是我在向代理发送请求的客户端上得到的:
~#Sent : POST http://127.0.0.1:3001 HTTP/1.1
Host: 127.0.0.1:3001
Proxy-Connection: keep-alive
Content-Length: 5
hello
#Received : HTTP/1.1 200 OK
Server: squid/3.5.19
Mime-Version: 1.0
Date: Mon, 10 Oct 2016 00:46:39 GMT
X-Transformed-From: HTTP/0.9
X-Cache: MISS from kali
X-Cache-Lookup: MISS from kali:3128
Transfer-Encoding: chunked
Via: 1.1 kali (squid/3.5.19)
Connection: keep-alive
#Received : B2
POST / HTTP/1.1
Content-Length: 5
Host: 127.0.0.1:3001
Via: 1.1 kali (squid/3.5.19)
X-Forwarded-For: 127.0.0.1
Cache-Control: max-age=259200
Connection: keep-alive
hello
#Sent : POST http://127.0.0.1:3001 HTTP/1.1
Host: 127.0.0.1:3001
Proxy-Connection: keep-alive
Content-Length: 5
hello
在这之后没有收到任何东西..
【问题讨论】:
-
几个问题:1) 为什么不使用代理感知的
http.client? 2) 您能否在同一个套接字上向源提供两个请求,而第二个请求无法通过代理? -
感谢您这么快回复!就像我说的那样,我真的很想坚持使用套接字库,以了解我在做什么,然后再转向更复杂的库。我用你问的内容编辑了这篇文章,希望这能让事情变得更清楚..
-
您示例中的第二个请求看起来错误。代理请求必须在请求的第一行包含完整的 URL。 IE。
POST http://127.0.0.1:3001/ HTTP/1.1而不是POST / HTTP/1.1 -
第二个是从代理发送到服务器并发送回客户端的那个(收到的回复有一个“已接收:”)第一个请求与最后一个请求相同并在开始时自动完成以建立与 te 代理的连接
标签: python sockets proxy server client