最近在啃《python核心编程(第三版)》,感觉这本书并不是特别的友好,虽然有基于python3提出的改进代码;但是整书的基准感觉还是在python2.7。所以python3的代码中还是有较多的错误;就比如第二章网络编程中:

原代码:

创建TCP服务器

  1. #coding=utf-8
  2. from socket import *
  3. from time import ctime
  4. HOST=''
  5. PORT=21567
  6. BUFSIZ=1024
  7. ADDR=(HOST,PORT)
  8. tcpSerSock=socket(AF_INET,SOCK_STREAM) #创服务器套接字
  9. tcpSerSock.bind(ADDR) #套接字与地址绑定
  10. tcpSerSock.listen(5) #监听连接,传入连接请求的最大数
  11. while True:
  12. print('waiting for connection...')
  13. tcpCliSock,addr =tcpSerSock.accept()
  14. print('...connected from:',addr)
  15. while True:
  16. data =tcpCliSock.recv(BUFSIZ)
  17. #print('date=',data)
  18. if not data:
  19. break
  20. tcpCliSock.send(('[%s] %s' %(ctime(),data)))
  21. tcpCliSock.close()
  22. tcpSerSock.close()

TCP客户端

  1. #coding=utf-8
  2. from socket import *
  3. HOST = 'localhost' # or 'localhost'
  4. PORT = 21567
  5. BUFSIZ = 1024
  6. ADDR=(HOST,PORT)
  7. tcpCliSock = socket(AF_INET,SOCK_STREAM)
  8. tcpCliSock.connect(ADDR)
  9. while True:
  10. data = input('> ')
  11. print('data=',data);
  12. if not data:
  13. break
  14. tcpCliSock.send(data)
  15. data = tcpCliSock.recv(BUFSIZ)
  16. if not data:
  17. break
  18. print(data)
  19. tcpCliSock.close()

如果我们按照这个代码跑,python3会报出:TypeError: a bytes-like object is required, not 'str' 的错误。当时我就很纳闷,python2.7中明明是适用的,怎么到python3中就为'str'了?报错的原因是tcpCliSock.send(data)传入的参数应该是bytes类型,而不是str类型。

关于这个的解释为python3与python2.7中关于编码解码的规则不同,请看下面。

关于编码

(引用自廖雪峰老师的教程)

由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。

Python对bytes类型的数据用带b前缀的单引号或双引号表示:b'ABC纯英文的str可以用ASCII编码为bytes,内容是一样的,含有中文的str可以用UTF-8编码为bytes。含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。

在bytes中,无法显示为ASCII字符的字节,用\x##显示。

反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法。

修改后的代码

  1. from socket import *
  2. from time import ctime
  3. HOST = ''
  4. PORT = 21567
  5. BUFSIZ = 1024
  6. ADDR = (HOST, PORT)
  7. tcpSerSock = socket(AF_INET, SOCK_STREAM)
  8. tcpSerSock.bind(ADDR)
  9. tcpSerSock.listen(5)
  10. while True:
  11. print('等待连接中')
  12. tcpCliSock, addr = tcpSerSock.accept()
  13. print('...connected from:', addr)
  14. while True:
  15. data = tcpCliSock.recv(BUFSIZ)
  16. if not data:
  17. break
  18. tcpCliSock.send(('[%s] %s' % (ctime(), data)).encode())
  19. tcpCliSock.close()
  20. tcpSerSock.close()
  1. from socket import *
  2. HOST = '127.0.0.1'
  3. PORT = 21567
  4. BUFSIZ = 1024
  5. ADDR =(HOST, PORT)
  6. tcpCliSock = socket(AF_INET, SOCK_STREAM)
  7. tcpCliSock.connect(ADDR)
  8. while True:
  9. data = input()
  10. if not data:
  11. break
  12. tcpCliSock.send(data.encode())
  13. data = tcpCliSock.recv(BUFSIZ).decode()
  14. if not data:
  15. break
  16. print(data)
  17. tcpCliSock.close()

Python网络编程(一)的更多相关文章

  1. Python 网络编程(二)

    Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...

  2. Python 网络编程(一)

    Python 网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. ...

  3. Python学习(22)python网络编程

    Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...

  4. Day07 - Python 网络编程 Socket

    1. Python 网络编程 Python 提供了两个级别访问网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...

  5. python网络编程-01

    python网络编程 1.socket模块介绍 ①在网络编程中的一个基本组件就是套接字(socket),socket是两个程序之间的“信息通道”. ②套接字包括两个部分:服务器套接字.客户机套接字 ③ ...

  6. 《Python网络编程》学习笔记--使用谷歌地理编码API获取一个JSON文档

    Foundations of Python Network Programing,Third Edition <python网络编程>,本书中的代码可在Github上搜索fopnp下载 本 ...

  7. Python网络编程基础pdf

    Python网络编程基础(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1VGwGtMSZbE0bSZe-MBl6qA 提取码:mert 复制这段内容后打开百度网盘手 ...

  8. python 网络编程(Socket)

    # from wsgiref.simple_server import make_server## def RunServer(environ,start_response):# start_resp ...

  9. python 网络编程 IO多路复用之epoll

    python网络编程——IO多路复用之epoll 1.内核EPOLL模型讲解     此部分参考http://blog.csdn.net/mango_song/article/details/4264 ...

  10. 自学Python之路-Python网络编程

    自学Python之路-Python网络编程 自学Python之路[第一回]:1.11.2 1.3

随机推荐

  1. AtCoder Grand Contest 015 题解

    A - A+...+B Problem 常识 Problem Statement Snuke has N integers. Among them, the smallest is A, and th ...

  2. Swift中的参数内部名称和外部名称

    1.什么是参数的内部名称和外部名称? struct Color { let red, green, blue: Double init(red redColor: Double,green green ...

  3. 客户端调用服务器端方法——ASP.NET AJAX(Atlas)、Anthem.NET和Ajax.NET Professional实现之小小比较

    前几天曾经发过一篇<ASP.NET AJAX(Atlas)和Anthem.NET——管中窥豹般小小比较>,Jeffrey Zhao说用ASP.NET AJAX中的UpdatePanel似乎 ...

  4. chrome中的content script脚本文件

    打开chrome的devtools工具,sources下有一个Content script: 1 chrome插件开发过程中难免会遇到使用content script来操作页面的dom,在chrome ...

  5. docker异常处理

    Error running DeleteDevice dm_task_run failed重启docker即可 Error starting daemon: error initializing gr ...

  6. 浅谈Huffman树

    所谓Huffman树,就是叶子结点带权的\(K\)叉树,假设每个叶子的权值为\(v\),到根的距离为\(dep\),那么最小化\(\sum v_i*dep_i\)就是\(Huffman\)树的拿手好戏 ...

  7. QT4.8.5+qt-vs-addin-1.1.11+VS2010安装配置和QT工程的新建和加载

    1.下载windows下的QT库 QT4.8.5 for vs2010: http://download.qt-project.org/official_releases/qt/4.8/4.8.5/q ...

  8. sharepoint Foundation 2013 error

    安装必须软件时提示以下错误 错误提示日志: 015-05-28 10:40:25 - Request for install time of 应用程序服务器角色.Web 服务器(IIS)角色2015- ...

  9. DOS查看端口占用及杀掉进程命令

    转载自:http://www.cnblogs.com/rainman/p/3457227.html 1. 查看端口占用 在windows命令行窗口下执行: netstat -aon|findstr & ...

  10. datanode与namenode的通信原理

    在分析DataNode时, 因为DataNode上保存的是数据块, 因此DataNode主要是对数据块进行操作. **A. DataNode的主要工作流程:** 1. 客户端和DataNode的通信: ...