python3.x - 关于Python3.5中recv()的疑问
本文介绍了python3.x - 关于Python3.5中recv()的疑问的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
一段代码:
import argparse
import socket
import sys
from binascii import hexlify
def main():
# setup argument parsing
parser=argparse.ArgumentParser(description='Socket Error Examples')
parser.add_argument('--host',action='store',dest='host',required=False)
parser.add_argument('--port',action='store',dest='port',type=int,required=False)
parser.add_argument('--file',action='store',dest='file',required=False)
given_args=parser.parse_args()
host=given_args.host
port=given_args.port
filename=given_args.file
# First try-except block -- create socket
try:
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
except socket.error as err_msg:
print('Error creating socket: %s' %err_msg)
sys.exit(1)
# Second try-except block -- connect to given host/port
try:
s.connect((host,port))
except socket.gaierror as err_msg:
print('Address-related error connecting to server: %s' %err_msg)
sys.exit(1)
except socket.error as err_msg:
print('Connection error: %s' %err_msg)
sys.exit(1)
# Third try-except block -- sending data
try:
s.sendall(bytes('GET %s HTTP/1.1\r\n\r\nHost:%s' %(filename,host),'utf8'))
except socket.error as err_msg:
print('Error sending data: %s' %err_msg)
sys.exit(1)
while 1:
# Fourth try-except block -- waiting to receive data from remote host
try:
buf=s.recv(2048)
except socket.error as err_msg:
print('Error receiving data: %s' %err_msg)
sys.exit(1)
if not len(buf):
break
# write the received data
sys.stdout.write(buf.decode('utf-8'))
s.close()
if __name__ == '__main__':
main()
如果这段写成:
sys.stdout.write(buf)
无法正确将收到的html文件在浏览器中解析
但是写成:
sys.stdout.write(buf.decode('utf-8'))
又会提示:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 2047: unexpected end of data
请问,在Python3.5中,recv()得到的内容如何正确处理并输出?
解决方案
sys.stdout.write(buf.decode('utf-8'))
你能保证发送过来的文件的编码一定是utf-8
?
改成别的编码试试看~ 例如:gbk
因为解码出来的内容里面有这个: <meta http-equiv="Content-Type" content="text/html; charset=utf-8">(部分解码是成功的,也显示出来了,但是解着解着就失败了)
成长中的程序猿
把解码语句移到循环外~
buffer = []
while 1:
# Fourth try-except block -- waiting to receive data from remote host
try:
buf=s.recv(2048)
except socket.error as err_msg:
print('Error receiving data: %s' %err_msg)
sys.exit(1)
if not len(buf):
break
# write the received data
buffer.append(buf)
s.close()
sys.stdout.write(b''.join(buffer).decode('utf-8'))
这篇关于python3.x - 关于Python3.5中recv()的疑问的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文