猿问

如何在不使用任何库的情况下向服务器发送 HTTP 请求并在 python 中获得答案

我刚刚在 Codeacademy 上完成了 Python 课程并阅读了一本关于网络的书。现在我想使用 HTTP 协议向谷歌服务器(或其他地方)发送一条 GET 消息,并仅使用 python 脚本读取请求。但我不想使用任何东西,但套接字模块


原因是它似乎很容易。只需创建一个 TCP 连接并发送一条消息,然后接收答案。我觉得为这个东西使用一个特殊的库是一个松散的人,我只需要自己做!


import socket


servername = 'google.com'

serverport = 80


clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sentence = 'GET / HTTP/1.1\nHost: google.com\nConnection: close'.format(servername)

print(sentence)


clientsocket.connect((servername, serverport))

clientsocket.send(sentence.encode())


new_sentence = clientsocket.recv(1024)

print('from server: {}'.format(new_sentence.decode()))


clientsocket.close()

我尝试了不同的代码方法,但据我所知,它应该看起来像这样,有什么问题?为什么它不起作用?


慕少森
浏览 223回答 2
2回答

MMTTMM

您没有收到服务器的响应,因为它仍在等待您的数据。在HTTP 协议中,您应该发送\r\n\r\n(CRLF CRLF) 以通知服务器有关请求标头的结束。CRLF = '\r\n'sentence = CRLF.join(['GET / HTTP/1.1', 'Host: ' + servername, 'Connection: close', '', ''])

慕慕森

import socketservername = 'google.com'serverport = 80clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sentence = '''GET / HTTP/1.1Host: {}Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: en-US;q=0.5,en;q=0.3Connection: close'''.format(servername)print(sentence)clientsocket.connect((servername, serverport))clientsocket.send(sentence.encode())new_sentence = clientsocket.recv(1024)print('from server: {}'.format(new_sentence.decode()))clientsocket.close()
随时随地看视频慕课网APP

相关分类

Python
我要回答