• Python学习十:网络编程


    一、网络基础

    1.1 为什么要使用通信协议

    为了把全世界的所有不同类型的计算机都连起来,就必须规定一套全球通用协议,为了实现互联网这个目标。

    1.2 TCP/IP 简介

    在这里插入图片描述

    1.3 UDP 简介

    相对于TCP,UDP是面向无条件连接的协议,速度更快,但是不可靠。

    1. 为了在给定的主机上能识别多个目的地址,同时允许多个应用程序在同一台主机上工作并能独立地进行数据包的发送和接收,设计用户数据报协议UDP。
    2. UDP使用底层的互联网协议来传送报文,同IP一样提供不可靠的无连接数据包传输服务。它不提供报文到达确认、排序、及流量控制等功能。
    3. UDP Helper可以实现对指定UDP端口广播报文的中继转发,即将指定UDP端口的广播报文转换为单播报文发送给指定的服务器,起到中继的作用。

    1.4 Socket 简介

    所谓Socket就是套接字,套接字就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。
    一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口

    在这里插入图片描述

    1.41 Python 使用

    s=socket.socket(AddressFamily,type)

    1. AddressFamily:可以选择AF_INET(用于Internet 进程间通讯),或者使用AF_UNIX(用于同一台机器之间通信),实际工作用AF_INET
    2. Type:嵌套字类型,可以使SOCK_STREAM(流式嵌套字,主要用于TCP协议),或者使用SOCK_DGRAM(数据报套接字,主要用于UDP协议)

    例如,为了创建TCP/IP套接字,可以使用如下方法调用socket.socket()

    tcpSock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    • 1

    为了创建UDP/IP套接字,可以使用如下方法调用socket.socket()

    udpSock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    
    • 1

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    二、TCP 编程

    2.1 创建TCP服务器

    
    #创建一个TCP服务器
      ss = socket()    #创建服务器套接字
      ss.bind()           #把地址绑定到套接字上
      ss.listen()         #监听连接
      inf_loop:           #服务器无线循环
          cone,addr = ss.accept()    #接收客户端连接
      comm_loop:      #通信循环
          cone.recv()/cs.send()    #对话(接受与发送)
      cone.close()      #关闭客户端套接字
    ss.close()          #关闭服务器套接字(可选)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    eg:

    # -*- coding:utf-8 -*-
    import socket               #导入socket模块
    host = '127.0.0.1'          #主机IP
    port = 8080                     #端口号
    web = socket.socket()           #创建 socket 对象
    web.bind((host,port))       #绑定端口
    web.listen(5)               #设置最多连接数
    print ('服务器等待客户端连接...') 
    #开启死循环
    while True:
        conn,addr = web.accept()    #建立客户端连接
        data = conn.recv(1024).decode()      #获取客户端请求数据
        print(data)             #打印接受数据
        conn.sendall(b'HTTP/1.1 200 OK\r\n\r\nHello World')     #向客户端发送数据
        conn.close()            #关闭链接 
    >>>
    
    服务器等待客户端连接...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    2.2 创建TCP客户端

    
    import socket       # 导入socket模块
    s= socket.socket()  # 创建TCP/IP套接字
    host = '127.0.0.1'  # 获取主机地址
    port = 8080        # 设置端口号
    s.connect((host,port)) # 主动初始化TCP服务器连接
    
    send_data = input("请输入要发送的数据:") # 提示用户输入数据
    s.send(send_data.encode()) # 发送TCP数据
    
    # 接收对方发送过来的数据,最大接收1024个字节
    recvData = s.recv(1024).decode()
    print('接收到的数据为:',recvData)
    
    # 关闭套接字
    s.close()
    >>>
    客户端控制台:
    请输入要发送的数据:123
    接收到的数据为: HTTP/1.1 200 OK
    Hello World
    
    服务端控制台:
    服务器等待客户端连接...
    123
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    2.3 执行TCP服务器和客户端

    服务器

    
    import socket               # 导入socket模块
    host = socket.gethostname() # 获取主机地址
    port = 12345                # 设置端口号   
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建TCP/IP套接字
    s.bind((host,port)) # 绑定地址(host,port)到套接字
    s.listen(1) # 设置最多连接数量
    sock,addr = s.accept() # 被动接受TCP客户端连接
    print('连接已经建立') 
    info = sock.recv(1024).decode() # 接收客户端数据
    while info != 'byebye':  # 判断是否退出
      if info :
        print('接收到的内容:'+info)
      send_data = input('输入发送内容:')   # 发送消息
      sock.send(send_data.encode()) # 发送TCP数据
      if send_data =='byebye':  # 如果发送exit,则退出
        break
      info = sock.recv(1024).decode() # 接收客户端数据
    sock.close() # 关闭客户端套接字
    s.close()    # 关闭服务器端套接字
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    客户端

    import socket       # 导入socket模块
    s= socket.socket()  # 创建TCP/IP套接字
    host = socket.gethostname() # 获取主机地址
    port = 12345        # 设置端口号     
    s.connect((host,port)) # 主动初始化TCP服务器连接
    print('已连接')
    info = ''           
    while info != 'byebye':  # 判断是否退出
      send_data=input('输入发送内容:')    # 输入内容
      s.send(send_data.encode()) # 发送TCP数据
      if send_data =='byebye': # 判断是否退出
        break
      info = s.recv(1024).decode() # 接收服务器端数据
      print('接收到的内容:'+info)
    s.close() # 关闭套接字
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    三、UDP编程

    3.1 服务端

    import socket
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #创建UDP套接字
    s.bind(('127.0.0.1', 8888)) # 绑定地址(host,port)到套接字
    print('绑定UDP到8888端口')
    # 接收数据:
    data, addr = s.recvfrom(1024)
    data = float(data)*1.8 + 32 # 转化公式
    send_data = '转换后的温度(单位:华氏温度):'+str(data)
    print('Received from %s:%s.' % addr)
    s.sendto(send_data.encode(), addr) # 发送给客户端
    s.close()    # 关闭服务器端套接字
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3.2 客户端

    
    import socket # 导入socket模块
    
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)        #创建UDP套接字
    data = input('请输入要转换的温度(单位:设置度):')     #输入要转化的温度
    s.sendto(data.encode(), ('127.0.0.1', 8888))               # 发送数据
    print(s.recv(1024).decode()) # 打印接收数据:
    s.close() # 关闭套接字
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    【Servlet】6:一篇文章搞懂Servlet对象的相互调用、数据共享
    Pandas索引操作
    死磕Java面试系列:深拷贝与浅拷贝的实现原理
    中兴通讯5G交付能力出众,助力泰国True运营商实现海岛5G网络全覆盖
    HarmonyOS 音频开发指导:使用 OpenSL ES 开发音频播放功能
    day02-代码实现01
    《视觉SLAM十四讲》-- 后端 1(下)
    7.关于线性回归模型的Q&A
    这个Python库助力pandas智能可视化分析
    Python 应用Graphviz画类图
  • 原文地址:https://blog.csdn.net/huiguo_/article/details/127643640