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

    关于网络编程中字符编码相关说明:
    • 网络编程中,服务器和浏览器只认bytes 类型数据。
    • send 函数的参数和 recv 函数的返回值都是 bytes 类型
     
    4种字符类型的编码:
    • ASCII:一个字节(byte)8比特位(bit),每个比特位表示0/1,除去一个奇偶校验位,ASCII码用1个字节编码表示128个字符,数字和符号。
    • Unicode:处理中文或者其他语言,至少需要2个字节,甚至复杂的字符需要更多字节,所以Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
    • UTF-8:如果全英文表示,比如代码,用Unicode编码比ASCII编码需要多一倍的存储空间。因此发明了“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。
    • GBK:中国的汉字编码方案,包含GB2312,和Unicode可以一一对应。
     
    字符的编码encoding和解码decoding:
    • python3内存中的默认编码为unicode(str类型表示),存储的时候默认以UTF-8存储(二进制数据byte类型表示)。
    • encode:str --> bytes
    • decode:bytes --> str
    • 用例1:服务器端和客户端通讯1
       
      服务器端
      import socket
       
      # 创建服务器端套接字
      sk = socket.socket()
       
      # 把地址绑定到套接字
      sk.bind(('127.0.0.1',8898)) 
       
      # 监听链接
      sk.listen()          
       
      # 接受客户端链接
      conn,addr = sk.accept() 
       
      # 接收客户端信息
      ret = conn.recv(1024)  
       
      # 打印客户端信息
      print('客户端信息:', ret.decode('utf-8'))
       
      # 向客户端发送信息
      conn.send(bytes("HELLO,我是服务器", encoding='utf-8'))    
       
      # 关闭客户端链接
      conn.close()       
       
      #关闭服务器套接字
      sk.close()        
       
      客户端
      import socket
       
      # 创建客户端套接字
      sk = socket.socket()           
       
      # 尝试连接服务器
      sk.connect(('127.0.0.1',8898)) 
       
      # 对话发送
      sk.send(bytes("HELLO,我是客户端", encoding='utf-8'))
       
      # 对话接收
      ret = sk.recv(1024)    
       
      # 打印服务器端信息        
      print('服务器端信息:', ret.decode('utf-8'))
       
      # 关闭客户端套接字
      sk.close()                    
       
      运行:
      在Pycham中打开Terminal1,运行服务器程序,此时服务器端在等待客户端消息
      (python3_for_training) U:ProjectPython_TrainingPytho_Basic>python TcpServerSimple.py
       
      在Pycham中打开Terminal2,运行客户端程序,此时客户端接收到了服务器端发送的'hi',打印显示,客户端回送消息'hello'。
      (python3_for_training) U:ProjectPython_TrainingPytho_Basic>python TcpClientSimple.py
      b'hi'
       
      此时再查看Terminal1,服务器端已经接收到客户端的消息,打印并显示
      (python3_for_training) U:ProjectPython_TrainingPytho_Basic>python TcpServerSimple.py
      b'hello!'
       

       
      用例2:服务器端和客户端通讯2
       
      服务器端
      import socket
       
      # 创建服务器端套接字
      sk = socket.socket()
       
      # 设置给定套接字选项的值。
      sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
       
      # 把地址绑定到套接字
      sk.bind(('127.0.0.1', 8898))
       
      # 监听链接
      sk.listen()
       
      # 接受客户端链接
      conn, addr = sk.accept()
       
      while True:
          # 接收客户端信息
          ret = conn.recv(1024)
       
          # 打印客户端信息
          print(ret.decode('utf-8'))
       
          # 结束处理
          if ret == b'bye':
              conn.send(b'bye')
              break
       
          info = input('>>>')
          conn.send(bytes(info, encoding='utf-8'))
       
      # 关闭客户端链接
      conn.close()
       
      # 关闭服务器套接字
      sk.close()     
       
      客户端
      import socket
       
      # 创建客户端套接字
      sk = socket.socket()           
       
      # 尝试连接服务器
      sk.connect(('127.0.0.1',8898))
       
      while True:
          # 信息发送
          info = input('>>>')
          sk.send(bytes(info,encoding='utf-8'))
       
          # 信息接收
          ret = sk.recv(1024)
       
          # 结束会话
          if ret == b'bye':
              sk.send(b'bye')
              break
       
          # 信息打印
          print(ret.decode('utf-8'))
       
      # 关闭客户端套接字
      sk.close()                    
       
      运行:
      在Pycham中打开Terminal1,运行服务器程序,可以和客户端程序聊天,打bye结束。
      (python3_for_training) U:ProjectPython_TrainingPytho_Basic>python TcpServerSimple.py
      你好啊
      >>>你好
      你有空吗
      >>>不,我没空
      bye
       
      在Pycham中打开Terminal2,运行客户端程序,可以和服务器程序聊天,打bye结束。
      (python3_for_training) U:ProjectPython_TrainingPytho_Basic>python TcpClientSimple.py
      >>>你好啊
      你好
      >>>你有空吗
      不,我没空
      >>>bye
  • 相关阅读:
    java:数组操作工具类 java.util.Arrays包 主要方法详解
    java:接口特性 接口与抽象类/普通类的区别
    mybatis教程:入门>>精通>>实战
    Java :内部类基础详解
    Java swing: 实现ActionListener监听器的三种途径
    Java:final、static关键字 详解+两者结合使用
    Java:双括号初始化 /匿名内部类初始化法
    Java:静态内部类的使用目的、使用限制、与非静态内部类的对比
    域名解析>>"记录类型" 说明
    Java:接口继承接口 (多继承机制)
  • 原文地址:https://www.cnblogs.com/JacquelineQA/p/13835655.html
Copyright © 2011-2022 走看看