任务是构建两个文件client.py和server.py。我可以将客户端连接到服务器。我遇到的问题是,当我试图发送类似client.send的get请求("bGET/suc.txt HTTP/1.1\r\nHost:120.0.1\r\n\r\n&"(时,我不知道如何从服务器端将文件suc.txt返回到客户端。场景是来自服务器的客户端请求文件,服务器返回的是响应标头和请求的文件。
到目前为止我写的:
客户:
import socket
target_host = "127.0.0.1"
target_port = 5050
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((target_host,target_port))
client.send("bGET /suc.txt HTTP/1.1rnHost:127.0.0.1rnrn")
response = client.recv(1024)
print(response.decode())
服务器:
import socket
import threading
import urllib.request
HEADER = 64
PORT = 5050
HOST = socket.gethostbyname(socket.gethostname())
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((HOST,PORT))
def handleClient(conn, addr):
print (f"[NEW CONNECTION {addr} connected. ")
connected = True
while connected:
conn.send()
def start():
server.listen()
while True:
conn, addr = server.accept()
thread = threading.Thread(target=handleClient, args=(conn,addr))
thread.start()
print(f"[ACTIVE CONNECTIONS] {threading.activeCount()} ")
print ("server is starting...")
start()
client.send("bGET /suc.txt HTTP/1.1rnHost:127.0.0.1rnrn")
"b..."
应该是b"..."
,即您希望指定一个字节序列,而不是以b
为第一个字符的字符串。
我不知道如何从服务器端向客户端返回文件suc.txt
你基本上会问非常广泛的问题,如何读取HTTP请求,从中提取信息,创建正确的响应并发送它。到目前为止,你所做的只是创建一个侦听器套接字,所以你离最终目标还很远。
有两种主要的方法来解决这个问题:最简单的方法是使用http.server这样的库来为您实现http的复杂性。该文档包含了如何做到这一点的实际例子,互联网上还有更多的例子。
更难的选择是研究实际的HTTP标准,并根据该标准自己实现所有内容。期望有人在这里解释复杂的标准并描述如何实现它将是一个过于宽泛的问题。