python网络编程——UDP_python udp class,2024年最新面试看什么书比较好

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Python全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注Python)
img

正文

#!/usr/bin/python
#coding:utf-8

import argparse,socket
from datetime import datetime

MAX_BYTES = 65535

#服务端代码
def server(port):
    '''
    创建空的套接字AF_INET表示协议族,SOCK_DGRAM数据报类型
    SOCK_DGRAM它表示在IP网络上使用UDP协议

    '''
    sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    #绑定IP地址和和端口
    sock.bind(('127.0.0.1',port))
    #getsockname()函数获取目前绑定的IP地址和端口号的二元组
    print("Listening at {}".format(sock.getsockname()))
    while True:
        #设置接受数据的最大字节,recvfrom()函数将返回客户端地址和数据报内容两个值
        data,address = sock.recvfrom(MAX_BYTES)
        text = data.decode('ascii')
        print('The client at {} says {!r}'.format(address,text))
        text = 'Your data was {} bytes long'.format(len(data))
        data = text.encode('ascii')
        sock.sendto(data,address)

#客户端代码
def client(port):
    sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    text = 'The time is {}'.format(datetime.now())
    data = text.encode('ascii')
    #设置要发送的信息和目标地址
    sock.sendto(data,('127.0.0.1',port))
    print('The OS assigned me the address {}'.format(sock.getsockname()))
    data,address = sock.recvfrom(MAX_BYTES)
    text = data.decode('ascii')
    print('The srever {} replied {!r}'.format(address,text))

if __name__ == '__main__':
    #设置命令行参数
    choices = {'client':client,'server':server}
    parser = argparse.ArgumentParser(description='Send and receive UDP locally')
    parser.add_argument('role',choices=choices,help='Which role to play')
    #用-p指定端口号
    parser.add_argument('-p',metavar='PORT',type=int,default=1060,help='UDP port (default 1060)')
    args = parser.parse_args()
    function = choices[args.role]
    function(args.p)

socket() 		 创建一个空的套接字
bind()     		 绑定UDP网络地址
getsockname()	 获取套接字绑定的IP地址和端口
recvfrom()		 接受返回发送该数据报的客户端地址和字节表示的数据报内容
sendto()         要发送的信息和目标地址

测试结果:
在这里插入图片描述

4.混杂客户端与垃圾回复。

recvfrom() 函数在接收数据报时并没有检查数据报的的源地址,也没有验证该数据包是否确实是服务器发回的响应,像这样不考虑地址是否正确,接收并处理所有的数据包的网络监听客户端的技术叫做混杂客户端。下面是监听模拟过程:
①启动一个新的服务器,然后Ctrl+Z停止启动一个新的服务器,然后Ctrl+Z停止
②运行客户端挂起等待
在这里插入图片描述
③伪造服务器响应。
在这里插入图片描述
④客户端等待结束,将伪造的服务器响应看成是服务器响应。
在这里插入图片描述

5.不可靠性、退避、阻塞和超时。

模拟数据包丢失和信号故障的UDP服务。
代码:

#!/usr/bin/python
#coding:utf-8
import  argparse,random,socket,sys

MAX_BYTES = 65535

def server(inerface,port):
    sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    sock.bind((inerface,port))
    print('Listening at',sock.getsockname())
    while True:
        data,address = sock.recvfrom(MAX_BYTES)
        #模拟包丢弃
        if random.random() < 0.5:
            print('Pretending to drop packet from {}'.format(address))
            continue
        text = data.decode('ascii')
        print('The client at {} says {!r}'.format(address,text))
        meassage = 'Your data was {} bytes long'.format(len(data))
        sock.sendto(meassage.encode('ascii'),address)

def client(hostname,port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    hostname = sys.argv[2]
    sock.connect((hostname,port))
    print('Client socket name is {}'.format(sock.getsockname()))
    #设置等待时间
    delay = 0.1
    text = 'This is another message'
    data = text.encode('ascii')
    while True:
        sock.send(data)
        print('Waiting up to {} seconds for a reply'.format(delay))
        sock.settimeout(delay)
        try:
            data = sock.recv(MAX_BYTES)
            break
        #超过等待时间抛出socket.timeout异常
        except socket.timeout:
            #将等待时间翻倍
            delay *= 2
            if delay > 2.0:
                raise RuntimeError('I think the server is down')

    print('The server says {!r}'.format(data.decode('ascii')))

if __name__ == '__main__':
    choices = {'client':client,'server':server}
    parser = argparse.ArgumentParser(description='Send and receive UDP,'
                                     'pretending packets are often dropped')
    parser.add_argument('role',choices=choices,help='Which role to take')
    parser.add_argument('host',help='interface the server listens at;'
                        'host the client sends to')
    parser.add_argument('-p',metavar='PORT',type=int, default=1060,
                        help = 'UDP port (default 1060)')
    args = parser.parse_args()
    function = choices[args.role]
    function(args.host,args.p)

该程序中的服务器并未始终响应客户端的请求,而是随机选择,只对收到的一半客户端请求做出响应。该客户端使用了一种叫做指数退避的技术就是让每次无法收到响应时的等待时间间隔翻倍。客户端还调用了settimeout()方法,用来通知操作系统,客户端进行一个套接字操作的最长等待时间是delay秒,一旦超过等待时间delay秒,就会抛出一个socket.timeout异常,recv调用就会中断。
测试结果:
在这里插入图片描述

6.连接UDP套接字。

connect():使用sendto()向服务器发送消息时必须每次向服务器给出服务器的IP地址和端口。而如果使用connect()调用,这样就可以简单地把发送的数据作为参数传入send()调用,不用给出服务器地址。connect()只是简单地将连接的地址写入操作系统的内存,以供之后send()和recv()调用。

7.请求ID。

请求ID是解决重复响应的好方法。重复响应问题是我们收到所有数据包后又收到一个被认为丢失的响应,此时可能误解这个是当前请求的响应。随机选择请求ID可以预防最简单的电子欺骗(spoofing)。

8.绑定接口。

服务器bind()绑定接口时,可以使用:

127.0.0.1 本机上其他应用程序接口
空字符串或者0.0.0.0 该服务器的任意网络接口
该服务器的一个外网IP

客户端:

客户端是同一台机器的自环接口127.0.0.1,不会响应
客户端是本机外网IP,可以连通
客户端是其他机器,可以连接

9.UDP分组。

由于某些数据包过大传输过程中需要将它分成一组一组的小数据包。MTU指“最大传输单元”或“最大数据包容量”。下面是模拟发送大型UDP数据包:
代码:

#!/usr/bin/python
#coding:utf-8
import argparse
import socket

#python3.7已经弃用IN模块了手动编写


**一、Python所有方向的学习路线**

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

![img](https://img-blog.csdnimg.cn/1d40facda2b84990b8e1743f5487d455.png)  
![img](https://img-blog.csdnimg.cn/0fc11d4a31bd431dbf124f67f1749046.png)

**二、Python必备开发工具**

工具都帮大家整理好了,安装就可直接上手!![img](https://img-blog.csdnimg.cn/ff266f529c6a46c4bc28e5f895dec647.gif#pic_center)

**三、最新Python学习笔记**

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

![img](https://img-blog.csdnimg.cn/6d414e9f494742db8bcc3fa312200539.png)

**四、Python视频合集**

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

![img](https://img-blog.csdnimg.cn/a806d9b941c645858c61d161aec43789.png)

**五、实战案例**

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。![img](https://img-blog.csdnimg.cn/a353983317b14d3c8856824a0d6186c1.png)

**六、面试宝典**

![在这里插入图片描述](https://img-blog.csdnimg.cn/97c454a3e5b4439b8600b50011cc8fe4.png)

![在这里插入图片描述](https://img-blog.csdnimg.cn/111f5462e7df433b981dc2430bb9ad39.png)

###### **简历模板**![在这里插入图片描述](https://img-blog.csdnimg.cn/646863996ac44da8af500c049bb72fbd.png#pic_center)




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)**
![img](https://img-blog.csdnimg.cn/img_convert/a66884e1604302efa34ad4d79e501e25.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
ic_center)




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)**
[外链图片转存中...(img-QLpCdmon-1713377829410)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值