我真的很擅长使用套接字进行编码。
我喜欢套接字库,我了解程序中发生的很大一部分,所以我不介意我想坚持使用它。
正如标题所说,我有一个基于套接字的客户端和服务器,我想通过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
此后没有收到......
答案 0 :(得分:0)
[8, 3]
正如您在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
中所述,您的HTTP响应正文包含7个字节而不是5个字节。 5字节后的Content-length
仍然属于响应主体。给出错误的大小可能会混淆请求处理,即代理期望新请求但实际上是\r\n
,即5个字节之后的2个字节\r\n
。
除此之外,路径和Content-length
标头必须包含代理角度的目标名称。使用127.0.0.1。在您的示例中,您将尝试访问代理的同一主机上的服务器,即代理视图中的localhost。这可能不是你想要的。
Host
代理响应中的此标头表示您的服务器未正确说出HTTP / 1.x.它不是发送HTTP头和主体,而是只返回没有任何HTTP头的有效载荷,就像在20年前废弃的HTTP 0.9协议中所做的那样。使用HTTP 0.9,响应将始终仅在TCP连接结束时结束。这意味着您不能在同一TCP连接中拥有多个请求。
我真的很擅长使用套接字进行编码。
问题不是由于错误使用套接字引起的,而是由于应用程序协议的错误实现,即数据通过套接字发送。如果您确实需要实施HTTP,请研究标准,即RFC 7230及以下。如果您不想这样做,请使用现有的和经过测试的HTTP库,而不是自己编写。