详解python的网络编程基础

张开发
2026/4/19 0:37:07 15 分钟阅读

分享文章

详解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 IPv6type也有三种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命令里面的IPV4s.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是形式为ipaddrport的元组指定远程地址。返回值是发送的字节数。s.close()关闭套接字。三.程序需求既然是实现一种交互那么生活中打电话和接收电话也可以理解为一种交互打电话就可以理解为发送数据收电话就可以理解为接收数据这样就有了服务端和客户端这里我们以这样一种场景实现交互。服务端分析如果你要发送数据首先你得有一个手机然后引入socket进行交互然后你要进行一系列的绑定操作即你需要上面的函数来实现首先你在客户端模拟一个手机引入socket之后你需要进行绑定开机等待电话链接收发消息挂电话等功能注意1.在绑定操作过程中你需要联网之后输入你本机的ip地址即你打开命令提示符你输入ipconifg命令的IPV4地址2.在绑定你的地址后后面会加一个端口号这个端口号是任意的不过有时候会被占用被占用则更改以下就好3.在手法消息中还有一个upper函数是将客户端发送过来的数据以大写的形式在发送给客户端4.在客户端用accept是接受TCP连接并返回conn,address123456789101112131415161718192021222324252627--------------------------------服务端----------------------importsocket#1.买手机phonesocket.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_addphone.accept()# 5.收发消息dataconn.recv(1024)#1024代表接收数据的最大数单位是bitsprint(客户端数据,data)conn.send(data.upper())#6.挂电话conn.close()#7.关机phone.close()客户端分析服务端分析完客户端和服务端是一一对应的在收发消息这里客户端给服务端发送一个小写的hello服务端就又会给客户端回一个大写的HELLO1234567891011121314151617-------------------------------客户端-----------------------------importsocket#1.买手机phonesocket.socket(socket.AF_INET,socket.SOCK_STREAM)# print(phone)#2.拨号phone.connect((192.168.2.18,3234))#3.发收消息phone.send(hells.encode(utf))dataphone.recv(1024)print(data)phone.close()四.代码升级加上通信循环上面的代码我们可以看出我们实现的太简单了我们只是固定的让它收发消息我们如何让这个程序在客户端和服务端之间循环并且收发你想要的东西呢这是我们加入输入和循环就可以123456789101112131415161718----------------------------服务端------------------------importsocketphonesocket.socket(socket.AF_INET,socket.SOCK_STREAM)# print(phone)phone.bind((172.20.10.4,3234))phone.listen(5)print(starting)conn,client_addphone.accept()print(client_add)whileTrue:dataconn.recv(1024)print(客户端数据,data)conn.send(data.upper())conn.close()phone.close()1234567891011121314----------------------------------客户端------------------------importsocketphonesocket.socket(socket.AF_INET,socket.SOCK_STREAM)# print(phone)phone.connect((172.20.10.4,3234))whileTrue:msginput(:).strip()phone.send(msg.encode(utf-8))dataphone.recv(1024)print(data)phone.close()大家可以看到我们只是在客户端里面加入了循环输入功能如何在服务端里加入循环这样就可以实现一种循环输入加上连接循环以及完善我们以上的程序都是一个客户端对应一个服务端但是真正应该服务端可以对应多个客户端收发数据。我们主要修改的是服务端代码客户端代码应该是变化不大的除了客户端应该加一个判断是否有数据发送。1.我们没有学习并发编程所以我们的代码用循环来实现即你的服务端接受完一个客户端的数据以后你可以继续去接收另一个客户端的数据2.除此之外我们还加上了一行代码用于判断你的端口是否被占用这样就可以减少出错3.我在加上一个客户端之后我们会出现另外一个问题就是我们到底需不需要另一个客户端传输的数据或者说我们的多个客户端到底有没有都发送数据所以我们这里需要一个try和except先去判断一下

更多文章