详解python的网络编程基础
一.什么是网络编程
网络编程涉及到一些计算机基础知识,还跟你的电脑系统有关,mac os/Linux和windows是不同的,由于我用的是windows,所以以下所有都是windows操作系统的适用的,并且里面的字符编码windows和mac os也是不同的,这里我们实现的只是简单的服务端发送什么,客户端就接收到什么,之后还会有模拟ssh的远程命令还有粘包问题,最后也可以实现文件的下载。
网络编程还涉及到重要的一部分理论知识包括什么是网络还有比较重要的五层协议,以我的理解,这些东西就是专业的告诉你,在你的电脑上假设要接收一些文件,这些东西是怎么传输过来的,你的电脑又是怎么接收的,所以这里无非就是你的电脑即客户端和传输文件的一方即服务点进行的一个交互,这些我都建议你去听一下(我感觉以个人能力讲这些会有点水平不足)但是大的方面都离不开一种交互。
二.socket
众所周知,python功能的强大很大一方面就在于它有强大的第三方外部库,socket这个库又叫套接字,专业解释就是应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯,进而通过socket这个库就可以实现我在前面所说的客户端和服务端的交互。
1.socket的基本语法
socket(family,type,[protocol])
其中的family有三种
socket.AF_UNIX
只能够用于单一的Unix系统进程间通信
socket.AF_INET
服务器之间网络通信
socket.AF_INET6 IPv6
type也有三种
socket.SOCK_STREAM
流式socket , 当使用TCP时选择此参数
socket.SOCK_DGRAM
数据报式socket ,当使用UDP时选择此参数
socket.SOCK_RAW
原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW
可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。
而protocol 指明所要接收的协议类型,通常为0或者不填,基本上是不写的
2.与socket有关的一些函数
服务端函数
address
一般指你的电脑上的ip地址,即你打开Windows的命令提示符,你联网之后输入ipconfig命令,里面的IPV4
s.bind(address)
将套接字绑定到地址,即在客户端中,你要把你的程序绑定一个ip和端口才能实现交互
s.listen(backlog)
操作系统可以挂起的最大连接数量。即你的服务端最多能把数据传给几个客户端
s.accept()
接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。
客户端函数
s.connect(address)
连接到客户端address处的套接字
s.recv(bufsize)
接受TCP套接字的数据。数据以字符串形式返回,bufsize指定要接收的最大数据量。
公共函数
s.send(string)
发送TCP数据。将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。
s.sendall(string)
完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。
s.recvfrom(bufsize)
接受UDP套接字的数据。与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。
s.sendto(string,address)
发送UDP数据。将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。
s.close()
关闭套接字。
三.程序需求
既然是实现一种交互,那么生活中打电话和接收电话也可以理解为一种交互,打电话就可以理解为发送数据,收电话就可以理解为接收数据,这样就有了服务端和客户端,这里我们以这样一种场景实现交互。
服务端分析
如果你要发送数据首先你得有一个手机然后引入socket进行交互,然后你要进行一系列的绑定操作即你需要上面的函数来实现,首先你在客户端模拟一个手机引入socket之后,你需要进行绑定,开机,等待电话链接,收发消息,挂电话等功能
注意:
1.在绑定操作过程中,你需要联网之后输入你本机的ip地址,即你打开命令提示符你输入ipconifg命令的IPV4地址
2.在绑定你的地址后后面会加一个端口号,这个端口号是任意的,不过有时候会被占用,被占用则更改以下就好
3.在手法消息中还有一个upper函数,是将客户端发送过来的数据以大写的形式在发送给客户端
4.在客户端用accept是接受TCP连接并返回(conn,address)
--------------------------------服务端---------------------- import socket #1.买手机 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # print(phone) #测试你的手机 #2.插卡 绑定手机卡 phone.bind(("192.168.2.18",3234)) #3.开机 phone.listen(5) #5代表最大挂起的连接数 #4.等电话链接 print("starting") conn,client_add = phone.accept() # 5.收发消息 data=conn.recv(1024) #1024代表接收数据的最大数,单位是bits print("客户端数据",data) conn.send(data.upper()) #6.挂电话 conn.close() #7.关机 phone.close()
客户端分析
服务端分析完,客户端和服务端是一一对应的,在收发消息这里,客户端给服务端发送一个小写的hello,服务端就又会给客户端回一个大写的HELLO
-------------------------------客户端----------------------------- import socket #1.买手机 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # print(phone) #2.拨号 phone.connect(("192.168.2.18",3234)) #3.发收消息 phone.send("hells".encode("utf")) data=phone.recv(1024) print(data) phone.close()
四.代码升级
加上通信循环
上面的代码我们可以看出,我们实现的太简单了,我们只是固定的让它收发消息,我们如何让这个程序在客户端和服务端之间循环并且收发你想要的东西呢,这是我们加入输入和循环就可以
----------------------------服务端------------------------ import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # print(phone) phone.bind(("172.20.10.4",3234)) phone.listen(5) print("starting") conn,client_add = phone.accept() print(client_add) while True: data=conn.recv(1024) print("客户端数据",data) conn.send(data.upper()) conn.close() phone.close()
----------------------------------客户端------------------------ import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # print(phone) phone.connect(("172.20.10.4",3234)) while True: msg = input(">>>:").strip() phone.send(msg.encode("utf-8")) data=phone.recv(1024) print(data) phone.close()
大家可以看到,我们只是在客户端里面加入了循环输入功能如何在服务端里加入循环,这样就可以实现一种循环输入
加上连接循环以及完善
我们以上的程序都是一个客户端对应一个服务端,但是真正应该服务端可以对应多个客户端收发数据。我们主要修改的是服务端代码,客户端代码应该是变化不大的,除了客户端应该加一个判断是否有数据发送。
1.我们没有学习并发编程,所以我们的代码用循环来实现即你的服务端接受完一个客户端的数据以后,你可以继续去接收另一个客户端的数据
2.除此之外我们还加上了一行代码用于判断你的端口是否被占用这样就可以减少出错
3.我在加上一个客户端之后我们会出现另外一个问题就是我们到底需不需要另一个客户端传输的数据或者说我们的多个客户端到底有没有都发送数据,所以我们这里需要一个try和except先去判断一下
--------------------------------服务端----------------------- import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #判断接口是否被占用 phone.bind(("172.20.10.4",3234)) phone.listen(5) print("starting") while True: #没有学习并发编程 没办法执行代码后返回到这继续执行,所以用循环解决 conn,client_add = phone.accept() print(client_add) while True: try: data=conn.recv(1024) if not data:break print("客户端数据",data) conn.send(data.upper()) except ConnectionResetError : break conn.close() phone.close()
-----------------客户端1----------------- import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.connect(("172.20.10.4",3234)) while True: msg = input(">>>:").strip() if not msg: continue #若输入空则继续循环 phone.send(msg.encode("utf-8")) # print("if send none") data=phone.recv(1024) print(data) # print(data.decode("utf-8")) phone.close()
-----------------------------客户端2--------------------- import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.connect(("172.20.10.4",3234)) while True: msg = input(">>>:").strip() if not msg: continue #若输入空则继续循环 phone.send(msg.encode("utf-8")) # print("if send none") data=phone.recv(1024) print(data) # print(data.decode("utf-8")) phone.close()
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注猪先飞的更多内容!
原文出处:https://blog.csdn.net/weixin_63997211/article/details/122137
相关文章
- 这篇文章主要介绍了python-opencv-画外接矩形框的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-04
Python astype(np.float)函数使用方法解析
这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08- 2022虎年新年即将来临,小编为大家带来了一个利用Python编写的虎年烟花特效,堪称全网最绚烂,文中的示例代码简洁易懂,感兴趣的同学可以动手试一试...2022-02-14
- 在本篇文章里小编给大家分享的是一篇关于python中numpy.empty()函数实例讲解内容,对此有兴趣的朋友们可以学习下。...2021-02-06
python-for x in range的用法(注意要点、细节)
这篇文章主要介绍了python-for x in range的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-10- 这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- 这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 这篇文章主要介绍了python如何实现b站直播自动发送弹幕,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-02-20
python Matplotlib基础--如何添加文本和标注
这篇文章主要介绍了python Matplotlib基础--如何添加文本和标注,帮助大家更好的利用Matplotlib绘制图表,感兴趣的朋友可以了解下...2021-01-26- 这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
- 今天小编就为大家分享一篇python 计算方位角实例(根据两点的坐标计算),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
- 这篇文章主要为大家详细介绍了python实现双色球随机选号,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-05-02
- 在本篇文章里小编给大家整理的是一篇关于python中使用np.delete()的实例方法,对此有兴趣的朋友们可以学习参考下。...2021-02-01
- 这篇文章主要介绍了使用Python的pencolor函数实现渐变色功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-09
Python getsizeof()和getsize()区分详解
这篇文章主要介绍了Python getsizeof()和getsize()区分详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-20- 这篇文章主要介绍了python自动化办公操作PPT的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-05
- 这篇文章主要介绍了解决python 两个时间戳相减出现结果错误的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-12
- 这篇文章主要为大家详细介绍了python实现学生通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-25
- 这篇文章主要介绍了PyTorch一小时掌握之迁移学习篇,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-08
- 这篇文章主要介绍了Python绘制的爱心树与表白代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-06