zoukankan      html  css  js  c++  java
  • Python网络编程(一)

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

    创建TCP服务器

    #coding=utf-8
    from socket import *
    from time import ctime
    
    HOST=''
    PORT=21567
    BUFSIZ=1024
    ADDR=(HOST,PORT)
    
    tcpSerSock=socket(AF_INET,SOCK_STREAM) #创服务器套接字
    tcpSerSock.bind(ADDR) #套接字与地址绑定
    tcpSerSock.listen(5)  #监听连接,传入连接请求的最大数
    
    while True:
        print('waiting for connection...')
        tcpCliSock,addr =tcpSerSock.accept()
        print('...connected from:',addr)
    
        while True:
            data =tcpCliSock.recv(BUFSIZ)
            #print('date=',data)
            if not data:
                break
            tcpCliSock.send(('[%s] %s' %(ctime(),data)))
    
        tcpCliSock.close()
    tcpSerSock.close()
    

    TCP客户端

    #coding=utf-8
    
    from socket import *
    
    HOST = 'localhost' #  or 'localhost'
    PORT = 21567
    BUFSIZ = 1024
    ADDR=(HOST,PORT)
    
    tcpCliSock = socket(AF_INET,SOCK_STREAM)
    tcpCliSock.connect(ADDR)
    
    while True:
        data = input('> ')
        print('data=',data);
        if not data:
            break
        tcpCliSock.send(data)
        data = tcpCliSock.recv(BUFSIZ)
        if not data:
            break
        print(data)
    
    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()方法。

    修改后的代码

    from socket import *
    from time import ctime
    
    HOST = ''
    PORT = 21567
    BUFSIZ = 1024
    ADDR = (HOST, PORT)
    
    tcpSerSock = socket(AF_INET, SOCK_STREAM)
    tcpSerSock.bind(ADDR)
    tcpSerSock.listen(5)
    
    while True:
        print('等待连接中')
        tcpCliSock, addr = tcpSerSock.accept()
        print('...connected from:', addr)
    
        while True:
            data = tcpCliSock.recv(BUFSIZ)
            if not data:
                break
            tcpCliSock.send(('[%s] %s' % (ctime(), data)).encode())
    
        tcpCliSock.close()
    tcpSerSock.close()
    
    from socket import *
    
    HOST = '127.0.0.1'
    PORT = 21567
    BUFSIZ = 1024
    ADDR =(HOST, PORT)
    
    tcpCliSock = socket(AF_INET, SOCK_STREAM)
    tcpCliSock.connect(ADDR)
    
    while True:
        data = input()
        if not data:
            break
        tcpCliSock.send(data.encode())
        data = tcpCliSock.recv(BUFSIZ).decode()
        if not data:
            break
        print(data)
    
    tcpCliSock.close()
    
    作者:YunLambert

    -------------------------------------------

    个性签名:一名会音乐、爱健身的不合格程序员

    可以Follow博主的Github哦(っ•̀ω•́)っ✎⁾⁾

  • 相关阅读:
    pfofinet和S7
    A1010 Radix [二分/******]
    A1005 Spell It Right
    最大回文子串长度 [dp]
    HDU 1159 Common Subsequence [最长公共子序列]
    1045 Favorite Color Stripe [动态规划/最长不下降子序列]
    1007 Maximum Subsequence Sum [动态规划]
    数塔问题(递归/递推)
    hdu 畅通工程 [Kruskal/Prime]
    1087 All Roads Lead to Rome [dj]
  • 原文地址:https://www.cnblogs.com/yunlambert/p/8503108.html
Copyright © 2011-2022 走看看