Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python 3.5中为socket.sent()添加\n字节字符串_Python_Sockets - Fatal编程技术网

如何在Python 3.5中为socket.sent()添加\n字节字符串

如何在Python 3.5中为socket.sent()添加\n字节字符串,python,sockets,Python,Sockets,这是我的代码: import socket mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) mysock.connect(('www.py4inf.com', 80)) mysock.send(b'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n') while True: data = mysock.recv(1024) if ( len(data)

这是我的代码:

import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('www.py4inf.com', 80))
mysock.send(b'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n')
while True:
    data = mysock.recv(1024)
    if ( len(data) < 1 ) :
        break
    print(data)
mysock.close()
然而,我希望它是:

But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief

那么我该怎么办呢?

因为套接字返回的数据属于
字节类,然后被视为普通ascii或二进制,所以需要将其转换为字符串。因此,只需替换:

print(data)

你将不再把它作为一行,而是作为一个漂亮的打印字符串

而且,要提取内容,您只需执行以下操作:

print(s.decode('utf-8').split('\r\n\r\n', 1)[1])

您将获得内容,因为HTTP标准指定头和内容由一个双回车换行符分隔(即
\r\n\r\n
)。

长答案是。。。这是HTTP,因此标头和有效负载由一个空行分隔。找到第一个空行,数据就是下一个

empty_line = b'\r\n\r\n'
index = data.index(empty_line)
payload = data[index + len(empty_line):]
现在您得到了正确的字节字符串,但需要将其解码为字符串。由于标题没有给我们提示,utf-8是一个合理的选择

text = payload.decode('utf-8')
简单的回答是使用
requests
等工具为您找出答案

import requests
text = requests.get('http://www.py4inf.com/code/romeo.txt').text

(我为输出的可实现性添加了真正的回车,很明显这是在一行中)顺便问一下,为什么要发送原始HTTP请求?也许您想使用像
urllib
requests
这样的库来代替。这几乎可以正常工作,只是html中可能有空行,因此拆分所需的时间太少
split('\r\n\r\n',1)[1]
抓住了这一切。他的例子是一个带有unix行结尾的文件,因此头部分和内容部分很容易分开。但是对于html,你是对的,这可能发生,然后你所说的就可以了。@zmo你能理解为什么当原始页面是JEPG图片时,
.decode()
不起作用。请不要为新问题重复使用旧问题。请提出一个新问题。关于这个,我已经问过了☺
text = payload.decode('utf-8')
import requests
text = requests.get('http://www.py4inf.com/code/romeo.txt').text