如何编码字符串并在字节串

时间:2017-06-12 06:11:59

标签: python-3.x sockets request

我开始使用Python套接字,我在网上找到以下示例,用于向网址发送和接收数据:

import socket
import sys

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
    print("Failed to create socket")
    sys.exit()

print("Socket created")

host = input("Enter URL here: ")
port = 80

try:
    remoteIP = socket.gethostbyname(host)
except socket.gaierror:
    print("Host name could not be resolved")
    sys.exit()

s.connect((remoteIP, port))

print("Socket connected to " + host + " on IP " + remoteIP)

message = "GET / HTTP/1.1\r\n\r\n"
messagebytes = str.encode(message)

try:
    s.sendall(messagebytes)
except socket.error:
    print("Send failed")
    sys.exit()

print("Message sent successfully")

reply = s.recv(4096)

print(reply)

现在问题是每当我运行此代码时,我得到以下输出:

  

b'HTTP / 1.1 400 Bad Request \ r \ n \ nCache-Control:no-cache \ r \ nPragma:no-cache \ r \ nContent-Type:text / html; charset = utf-8 \ r \ nProxy-Connection:close \ r \ nConnection:close \ r \ nContent-Length:1229 \ r \ n \ r \ n \ r \ n \ r \ n请求错误\ r \ n \ r \ n \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n 我的互联网访问
\ r \ n \ n \ n \ n \ r \ n \ r \ n \ r \ n

\ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n请求错误\ r \ n \ r \ n
\ r \ n \ r \ n
\ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ n \ n无法处理您的请求。请求无法处理\ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ n \ r \ n \ n \ n \ n \ n r \ n这可能是由配置错误或可能是格式错误的请求引起的。\ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ n \ r \ n \ r \ n \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ n如需帮助,请使用服务台记录电话。\ r \ n \ r \ n \ r \ n \ r \ n \ n

\ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n
\ r \ n \ r \ñ\ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \ r \ N'

我对此结果的唯一猜测是发送的邮件将以b" therefore GET / HTTP/1.1\r\n\r\n"b c的形式发送,因此会使其成为无效请求。我也尝试解码它并没有帮助,因为我得到与我不解码时完全相同的结果。

如果是这种情况我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

我尝试解码响应并完成了它。

>>> a=b'HTTP/1.1 400 Bad Request\r\nCache-Control: no-cache\r\nPragma: no-cache\r\nContent-Type: text/html; charset=utf-
8\r\nProxy-Connection: close\r\nConnection: close\r\nContent-Length: 1229\r\n\r\n\r\n\r\nRequest Error\r\n\r\n\r\n\r\n\r
\n\r\n\r\n\r\nMy Internet Access\r\n\r\n--\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r
\n\r\n\r\n\r\nRequest Error\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nYour request could no
t be processed. Request could not be handled\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nThis could be caused by a mi
sconfiguration, or possibly a malformed request.\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nFor assistance,
please log a call with the helpdesk.\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n'
>>> a.decode('UTF-8')
'HTTP/1.1 400 Bad Request\r\nCache-Control: no-cache\r\nPragma: no-cache\r\nContent-Type: text/html; charset=utf-8\r\nPr
oxy-Connection: close\r\nConnection: close\r\nContent-Length: 1229\r\n\r\n\r\n\r\nRequest Error\r\n\r\n\r\n\r\n\r\n\r\n\
r\n\r\nMy Internet Access\r\n\r\n--\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\
r\n\r\nRequest Error\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nYour request could not be pr
ocessed. Request could not be handled\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nThis could be caused by a misconfig
uration, or possibly a malformed request.\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nFor assistance, please
log a call with the helpdesk.\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n'

但您的代码问题出在请求标头中。如果您想获得某些页面内容,可以使用urllib.request包。 首先你需要一些设置:

import urllib.request as req


class Fetch:
    """
    Class responsible for getting code of page at specified url
    """

    def __init__(self, url):
        self.url = url
        self.data = None
        self.obj = None
        self.headers = None
        self.encoding = None

    def fetch_file(self):
        """
        :return: str contents of a website
            Returns string data form an url
        """

        self.obj = req.urlopen(self.url)
        self.encoding = self.obj.headers['content-type'].split('charset=')[-1]
        self.data = self.obj.read().decode(self.encoding)
        return self.data

然后导入Fetch类并将所需的url传递给init对象。最后调用fetch_file(),如果在响应头中指定了charset,则返回编码响应。

答案 1 :(得分:0)

发送时尝试:

message = "GET / HTTP/1.1\r\n\r\n"

s.sendall(messagebytes.encode())

在接收时:

reply = s.recv(4096)

print(reply.decode())
相关问题