• Python学习-网络编程


    @

    引言

    计算机网络是学习编程的基础四大件,而网络协议则是计算机网络的基础

    TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP,本文将介绍下这两者以及它们之间的区别。

    网络

    网络编程就是通过程序使不同主机上的软件能够通过网络进行通信

    IP

    ip是用来在网络中标记一台电脑的地址,在本地局域网内是唯一的。

    端口

    一台电脑有一个ip,但是一台电脑上有多个软件,怎么识别到不同软件进行通信,这时就需要端口,每个软件的端口在本地主机上都是唯一的。

    协议

    有了ip有了端口,好比商家有了你家小区的地址,单元号,但是该采用什么快递,怎么确保你收到货这些并没有确定,这时就需要商家-顾客有一个统一的规定对这些内容进行规定,这就是协议

    所以,ip地址+协议+端口 三者结合才可以可以标识网络中的进程,并利用这个标识进行进程之间的通信

    TCP/IP网络模型

    计算机与网络设备要相互通信,双方就必须基于相同的方法。比如

    • 如何探测到通信目标
    • 由哪一边先发起通信
    • 使用哪种语言进行通信
    • 怎样结束通信

    等等都需要事先确定规则。这种规则就是协议(protocol)

    TCP/IP 是互联网相关的各类协议族的总称,比如:TCP,UDP,IP,FTP,HTTP,ICMP,SMTP 等都属于 TCP/IP 族内的协议。
    在这里插入图片描述

    UDP

    socket(简称 套接字) 是进程间通信的一种方式,通过socket函数,我们可以指定期望的通信协议类型

    函数 socket.socket 创建一个 socket,该函数带有两个参数
    在这里插入图片描述第一个参数指明了协议簇,目前支持5种协议簇,最常用的有AF_INET(IPv4协议)和AF_INET6(IPv6协议)
    在这里插入图片描述
    第二个参数指明套接口类型,主要有种类型可选:SOCK_STREAM(字节流套接口)、SOCK_DGRAM(数据报套接口)和SOCK_RAW(原始套接口)

    下面是UDP客户端和服务器之间通信交互的时间线,相应的代码实现也是根据此框图进行实现
    在这里插入图片描述

    from socket import *
    
    udp_socket = socket(AF_INET, SOCK_DGRAM)
    
    dest_addr = ('192.168.123.1', 8888)
    
    send_data = input('请输入要发送的数据:')
    
    udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
    
    recv_data = udp_socket.recvfrom(1024)
    
    # 接收到的数据recv_data是一个元组
    # 第1个元素是对方发送的数据
    # 第2个元素是对方的ip和端口
    print(recv_data[0].decode('gbk'))
    print(recv_data[1])
    
    udp_socket.close()
    

    TCP

    TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议

    TCP通信需要经过创建连接、数据传送、终止连接三个步骤

    下面是TCP客户端和服务器之间通信交互的时间线,相应的代码实现也是根据此框图进行实现
    在这里插入图片描述

    from socket import *
    
    tcp_client = socket(AF_INET, SOCK_DGRAM)
    
    server_ip = input('input server ip:')
    server_port = input('input server port:')
    
    tcp_client.connect((server_ip,server_port))
    
    send_data = input('input send data:')
    
    tcp_client.send(send_data)
    
    tcp_client.send(send_data.encode("gbk"))
    
    recvData = tcp_client.recv(1024)
    print('接收到的数据为:', recvData.decode('gbk'))
    
    tcp_client.close()
    
  • 相关阅读:
    uva10422
    3259 spfa判断负环(邻接表)
    华东理工某ACMer总结
    POJ 1847 最短路径 垃圾水题可是坑爹多case问题初始化的锅
    HDU 1166 线段树基础题 基本模型
    用数组模拟邻接表
    优先队列
    POJ 3253 优先队列实现哈弗曼树
    POJ 3026 Kruskal+BFS
    POJ 1094差分约束系统拓扑排序
  • 原文地址:https://www.cnblogs.com/cokefentas/p/14933460.html
Copyright © 2020-2023  润新知