让python飞:形象理解python网络编程、IP、端口、网络模型、socket套接字、tcp协议、udp协议

2021/9/13 11:04:48

本文主要是介绍让python飞:形象理解python网络编程、IP、端口、网络模型、socket套接字、tcp协议、udp协议,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

在这里插入图片描述
Day18小猪佩奇造火箭和乔治交流
小猪佩奇想念弟弟了,但是他又不能见到弟弟,所以他想发明一种能让他和弟弟进行交流的工具
网络编程:让多台计算机之间可以进行通信(数据交互),涉及到了网络编程,划分为两个方向层面:1).我们称为客户端(cilent) 2).我们称为服务端(server))于是他造了一只火箭。首先他要告诉火箭自己的家的住址IP地址的作用:如果我们需要上网,每台计算机都会有一个唯一标识(符号),就是我们所谓的ip地址,ip地址是每台计算机在网络中的唯一标识(记住))但是他记不住家里的住址编号,所以就问小机器人管家,向它的小屏幕里输入ipconfig,然后他就把家里的住址编号告诉了佩奇。佩奇对家里的编号产生了好奇,这是由四个数字组成的编号(一个IPV4的地址是由四段0—255的数字组成:192.168.0.100)它是佩奇家地址的唯一标识。管家告诉佩奇,你要发射火箭的话,要问问我们有没有发射权,向我的小屏幕里输入’ping 空格127.0.0.1’,如果有回应就代表我们家有发射权啦利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。应用格式:ping空格IP地址。127.0.0.1:本机回环地址(解析为本机的ip),理解:localhost)小猪佩奇试了一下,果然有回应,于是,他开心极了!
火箭有了,但是得给他个编号啊(端口:一台计算机可能被装载很多的应用程序,如果我们需要去实现网络编程的话,在两个计算机之间程序数据交互需要通过端口号来找到相应的应用程序;理解:端口号是计算机中应用程序的唯一标识)家里面的所有东西都编过号了,所以1023以下的数字都不能用(范围:0~65535之间:注意:0~1023之间的端口我们不能直接设置使用,因为它们在安装完毕操作系统之后就被系统占用了;)像冲浪板代号为80(http:80)运货小卡车的编号为22(ftp: 22)邮筒编号为25(smtp:25)所以啊,你可以用1024到65535之间的数字进行编号。不过我们村的数字档案馆已经把3306给用了(mysql:3306)字典管理中心已经把6379给用了(redis:6379)所以你尽量用其他数字给你的火箭编号吧(通过IP地址可以连接到指定计算机,但如果想访问目标计算机中的某个应用程序,还需要指定端口号。在计算机中,不同的应用程序是通过端口号区分的。端口号是用两个字节(16位的二进制数)表示的,它的取值范围是0~65535,其中,0~1023之间的端口号用于一些知名的网络服务和应用,用户的普通应用程序需要使用1024以上的端口号,从而避免端口号被另外一个应用或服务所占用。)于是小猪佩奇开始设计火箭及其交流的方式。
佩奇心想,这交流起来,乔治那边的火箭和我的火箭得有个碰面的地方,小时候我们经常在停车棚玩,就在它们在那里碰面吧(tcp协议:特点:面向连接、可靠(安全)、效率慢 类似于我们生活中的:打电话)两个火箭见到面后首先要确认是不是对方,要先三次握手

tcp的连接过程:3次握手
	cilent(客)		sever(服)
	a:哥们,能听见我说话吗?
	b: 我能,你能听见我说话吗?
	a: 我也能,我们开始说话吧
	此处正在进行数据交互

两个火箭交流完后,告别时要挥手(断开连接的过程:第4次挥手 --> 程序中的体现:close())
和乔治联系前,要先把存放火箭的箱子拿出来(导入socket模块:import socket)从里面拿出一个火箭来

得到客户端的socket对象
tcp_cilent_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

这火箭头的小仓里得放上我的地址编号的理解方式(第一个参数:满足的是ipv4的规则(socket.AF_INET))和交流的方式,在停车棚就按面对面即时交流(第二个参数:判断/确定到底是满足tcp协议还是udp协议的规则编程(socket.SOCK_STREAM))然后把自己家的地址编号和火箭的编号都写到纸上(#定义服务器的ip和端口号(封装到一个元祖对象中)tcp_server = ('10.11.63.132',8888))贴在火箭上(连接服务器tcp_cilent_socket.connect(tcp_server))然后我就可以在家里不停的和乔治说话了(循环发送和接受数据while 1:)#客户端从键盘输入数据(字符串)data = input('>>>:')当然,为了保密,火箭会将我说的信息进行编密后再给乔治的火箭(将客户端的数据发送给服务器,我们在这个过程中需要对数据进行编码操作(有一定的安全性保障) tcp_cilent_socket.send(data.encode('utf-8'))当然,他也能收到乔治的火箭回复的信息(接受服务器给客户端传递(发送)过来的数据并且进行解码操作 recv_data = tcp_cilent_socket.recv(1024)在家里,佩奇将它用相应的编码格式打印出来(print('服务器:' + recv_data.decode('gbk')))最后,佩奇的火箭将和乔治的火箭说拜拜然后关闭回家(关闭套接字对象tcp_cilent_socket.close()
乔治那边的火箭怎么设计呢?同样,乔治也要先拿出火箭盒子(import socket)拿出火箭,并将乔治家的地址编码解析方式和地点放在小仓内

#得到服务端的socket对象
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

再把地址编号和火箭编号贴在火箭上

#绑定服务端的ip和端口号(元祖)tcp_server = ('10.11.62.101',8888)
tcp_server_socket.bind(tcp_server)

到了停车棚后,先打开耳朵,开启监听模式(#开启监听tcp_server_socket.listen())由于佩奇的火箭会将佩奇的信息和他的地址火箭信息发过来,乔治的火箭设计将接受后将信息分成两部分,佩奇的主要信息存放到一个新的小火箭里(#接受客户端的访问new_socket,cilent_info = tcp_server_socket.accept())开始受到佩奇的信息,小火箭将其存储,然后乔治在家里就可以打印出来,但是要用相应的解码方式

#接受客户端发来的数据
    recv_date = new_socket.recv(1024)
    print('客户端:' + recv_date.decode('utf-8'))

然后乔治在家里信息录入,小火箭编密后再送到佩奇火箭那里

#给客户端发送数据data = input('>>>:')
new_socket.send(data.encode('gbk'))

最后,小火箭先关闭,大火箭再关闭回去(#关闭两个套接字对象new_socket.close() tcp_server_socket.close())
还有一种情况是,佩奇的火箭到达后乔治的火箭不在怎么办?佩奇想起有一家店铺叫u店铺(udp协议:特点:面向无连接、不可靠、效率快。类似于我们生活中的:写信)他可以先让火箭把信息送到店铺,乔治的火箭去了再拿信息。同样,也要先从火箭箱子里拿出火箭(import socket使用udp协议编写客户端程序: 实例化socket对象)然后,在火箭的头上的小仓里写上地址的编码解析方式和见面的地点

#得到客户端的socket对象
udp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

将乔治家的地址编号和火箭编号写在俩丸子上

#定义服务器的ip和端口号封装到元祖对象中
udp_server = ('10.11.63.119',6666)

然后,佩奇开始在家里输信息

#循环发送和接受数据
while 1:
    data = input('>>>:')

火箭将数据编译好,将数据和那俩丸子一同放进火箭里送过去

#客户端给服务器发送数据
    udp_cilent_socket.sendto(data.encode('utf-8'),udp_server)

还要将佩奇返回的俩丸子存起来

#接受服务器给客户端的数据
    recv_data = udp_cilent_socket.recvfrom(1024)

佩奇在家里将第一个丸子用相应的解码方式打印出来

#得到一个元祖对象,我们需要的服务端发送过来的数据信息存储在此对象的第一个元素位上
 print(recv_data)
 print('服务器说:' + recv_data[0].decode('gbk'))

最后,将火箭关闭

#关闭套接字对象
udp_cilent_socket.close()


乔治的店铺火箭也是得先从火箭箱子里拿出来(import socket然后实例化 udp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM))将自己的住址编号和火箭编号刻在俩丸子上,贴在火箭上

#绑定服务端的ip和端口
udp_server = ('10.11.62.88',8888)
udp_server_socket.bind(udp_server)

到了店铺后,开始接收佩奇的火箭里的俩丸子,乔治在家把第一个丸子解码打印

#循环接受和发送数据:
while 1:
    #接受客户端的数据
    recv_data,cilent_info = udp_server_socket.recvfrom(1024)
    print(recv_data)
    print(cilent_info)
    print('客户端说:' + recv_data.decode('gbk'))

并在家把要回复的信息编码后,和佩奇的第二个丸子一块放进火箭送回去

#发送数据给客户端
    data = input('>>>:')
    udp_server_socket.sendto(data.encode('gbk'),cilent_info)

最后关闭火箭

#关闭套接字对象
udp_server_socket.close()

佩奇设计出的火箭非常成功,乔治为他感到非常骄傲。



这篇关于让python飞:形象理解python网络编程、IP、端口、网络模型、socket套接字、tcp协议、udp协议的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程