import socket
import re
def serve_client(client_socket, client_addr):
request = client_socket.recv(1024)
if request: # recv到数据
q = request.decode("utf-8").splitlines() # 提取请求
print(q) # 看看请求是什么
file_name = re.match(r"[^/]+(/[^ ]*)", q[0]).group(1) # 从请求中提取网址
if file_name == "/":
file_name = "/index.html"
try:
f = open("." + file_name, "rb")
except: # 没有该文件返回404
content = "404 page not found".encode()
response = "HTTP/1.1 404 NOT FOUND
"
response += "
"
client_socket.send(response.encode("utf-8"))
client_socket.send(content)
print("没有该文件")
else: # 有网址对应的文件,发送该文件
content = f.read()
f.close()
response = "HTTP/1.1 200 OK
"
response += "
"
# response += content
client_socket.send(response.encode("utf-8"))
client_socket.send(content)
print("发送成功")
else: # recv不到东西
print("REQUEST为空")
def main():
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcp_socket.bind(("", 7878))
tcp_socket.listen(128)
while True:
client_socket, client_addr = tcp_socket.accept()
print("新socket:", client_addr)
serve_client(client_socket, client_addr)
if __name__ == '__main__':
main()
打开浏览器,输入127.0.0.1:7878,按回车一次,与TCP服务器建立连接('127.0.0.1', 111111),然后顺利收发数据
控制台输出:
新socket: ('127.0.0.1', 111111)
['GET / HTTP/1.1', 'Host: 127.0.0.1:7878'....]
发送成功
新socket: ('127.0.0.1', 111112)
REQUEST为空
疑问1:为什么会马上accpet到另外一个新连接('127.0.0.1', 111112),这个新连接来自哪里?而且他会经过一段时间后会recv到空数据,这个连接的来源和作用是什么?
疑问2:当我采用网络调试助手来测试,与浏览器建立TCP连接,使用网络调试助手发送数据给浏览器时,浏览器会转圈圈,直到我把网络调试助手关闭连接,浏览器才会接到数据并停止转圈圈,但是为什么使用以上的代码充当服务器发送数据给浏览器时,浏览器却不会转圈圈呢
感谢大佬解惑,万分感激
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…