24.Python 网络编程:socket编程

简介: 24.Python 网络编程:socket编程

1.认识TCP/IP

计算机网络就是把各个计算机连接在一起,在网络中的计算机可以互相通信。

网络编程是如何在程序中实现两台计算机的通信。

网络通信是两台计算机上的两个进程之间的通信。

为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,互联网协议包含了上百种,但最重要的有TCP和IP协议。

TCP/IP 协议被分为4层:应用层、传输层、网络层、接口层:

  • 应用层协议有HTTP、FTP、SMTP等,用来接收来自传输层的数据或按不同应用要求及方式将数据传输至传输层。
  • 传输层协议有UDP、TCP,实现数据传输与数据共享。
  • 网络层协议有ICMP、IP、IGMP,主要负责网络中的数据包的传送等。
  • 接口层协议有ARP、RARP,主要提供链路管理、错误检测、对不同通信媒介有关信息细节问题进行有效处理等。

通信双方必须知道对方的标识,互联网每个计算 机的唯一标识就是IP地址。如果一台计算机同时接入两个或更多的网络,如路由器,就要有两个或多个IP地址。所以,IP地址对应的实际上是计算机的网络接口,通常是网卡。

TCP协议是建立IP协议之上的,负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。TCP协议会通过握手建立连接,然后对每个IP包编号,确保对方按顺序收到,如果包丢掉了,就自动重发。

2.socket编程

socket 是应用层与传输层、网络层之间进行通信的中间软件抽象层,是一组接口,把复杂的TCP/IP协议隐藏在socket接口后面,对用户来说,一组简单的接口就是全部,调用socket接口函数去组织数据,以符合指定的协议,这样网络间的通信业就简单了许多。


Python 提供了两个基本的socket处理模块。

  • socket:提供了标准的BSD Sockets API,可以访问底层操作系统socket接口的全部方法。
  • socketsever:提供了服务器中心类,可以简化网络服务器的开发。

2.1 使用socket

服务器

服务器端进程需要申请套接字,然后绑定套接字进行监听。当有客户端发送请求,则接收数据并进行处理,处理完后对客户端进行响应。

  1. 创建套接字
import socket
# socket模块的socket()函数能创建socket对象
socket.socket([family[,type[,proto]]])
'''
family:设置套接字种族,包括AF_UNIX和AF_INET,常用AF_INET选项。
type:设置套接字类型。
proto:协议类型,默认为0,一般不填。
'''
s1 = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 网络通信,协议类型
  1. 绑定套接字
s1.bind(address) # address 地址必须是一个元组:(host,port)
s1.bind((host,port))
  1. 监听套接字
s1.listen(backlog) # backlog指定最多允许多少个客户端连接服务器
  1. 等待接受连接
connection,address = s1.accept() # 阻塞状态


  1. 处理阶段
# 数据以字节串格式返回,bufsize指定最多可以接受的数量。
connection.recv(bufsize[,flag]) 
# 发送给连接的客户端套接字
connection.send(string[,flag])
  1. 关闭连接
s1.close()

客户端

客户端只需要申请一个套接字,然后通过套接字连接到服务器端,建立连接之后就可以通信。

  1. 创建套接字socket对象。
import socket # 导入socket模块
s2 = socket.socket()  # 实例化socket 对象
  1. 连接到服务器端。
s2.connect(address) # address 地址必须是一个元组:(host,port)
  1. 处理阶段。
# 数据以字节串格式返回,bufsize指定最多可以接受的数量。
s2.recv(bufsize[,flag])  
# 将参数string包含的字节串发送到服务器端
s2.send(string[,flag]) 
  1. 关闭连接。
s2.close()


示例:使用socket模块构建一个网络通信服务。

# 新建server.py,输入以下命令,作为服务器端响应文件
import socket
# 创建服务端服务
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('localhost',6999)) # 绑定要监听的端口,本地计算机6999
s.listen(5) # 开始监听,使用5个连接排队
while True:
    conn,addr = s.accept()
    print(conn,addr) # 输出连接信息
    try:
        data = conn.recv(1024) # 接收数据
        print('recive:',data.decode()) # 解码
        conn.send(data.upper()) # 发送数据
        conn.close() # 关闭连接
    except:
        print('出现异常')
        break
# 新建client.py,输入以下命令,作为客户端请求文件
import socket
c = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
c.connect(('localhost',6999)) #
msg = '欢迎新同学!'
c.send(msg.encode('utf-8')) # 发送一条信息,将字符串转换为字节流
data = c.recv(1024) # 接收信息,大小为1024字节
print('recv:',data.decode()) # 输出接收信息
c.close() # 关闭

2.2 使用socketserver

socketserver模块封装了socket模块和select模块,使用多线程处理多个客户端的连接,使用select模块处理高并发访问。

  • 服务类:提供了建立连接的过程,如绑定、监听、运行等。
  • 请求处理类:专注于如何处理用户发送的数据

服务类

服务类包含5种类型:

  • BaseServer:不直接对外服务。
  • TCPServer:针对TCP套接字流。
  • UDPServer:针对UDP数据报套接字。
  • UnixStreamServer和UnixDatagramServer:针对Unix域套接字,不常用。

请求处理类

socketserver 模块提供请求处理类BaseRequestHandler, 以及派生类StreamRequestHandler(处理流式套接字)和DatagramRequestHandler(处理数据报套接字)。请求处理类有3种方法:

  • setup():在handle()之前被调用,执行处理请求前的初始化操作,默认不做任何事情。
  • handle():执行与处理请求相关的工作。
  • finish():在handle()之后调用,执行处理完请求后的清理操作,默认不做任何事情。

使用socketserver创建一个服务,具体步骤如下:

  1. 创建一个请求处理类,选择StreamRequestHandler或DatagramRequestHandler作为父类,也可以选择BaseRequestHandler作为父类,并重写handle()方法。
  1. 实例化一个服务类对象,并将服务的地址和第1步创建的请求处理类传递给它。
  2. 调用服务类对象的handle_request()或server_forever()方法开始处理请求。

示例:使用socketserver模块构建一个网络通信服务。

# 新建server1.py,输入以下命令,作为服务器端响应文件
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler): # 自定义请求处理类
    def handle(self): # 重写handle()方法
        try:
            while True:
                self.data = self.request.recv(1024) # 接收数据
                print(self.client_address,self.data)  # 打印数据
                if not self.data: # 如果没有接收到数据
                    print('连接丢失')
                    break # 结束轮询
                self.request.sendall(self.data.upper()) # 向客户端响应数据
        except Exception as e:
            print(self.client_address,'连接断开')
        finally:
            self.request.close() # 关闭
    def setup(selfself): # 重写setup()方法
        print('setup被执行')
    def finish(self): # 重写finish()方法
        print('finish被执行')
if __name__ == "__main__":
    s = socketserver.TCPServer(('localhost',9999),MyTCPHandler)
    s.serve_forever()
# 新建client1.py,输入以下命令,作为客户端请求文件
import socket
c = socket.socket()
c.connect(('localhost',9999)) # 连接到服务器
while True:
    cmd = input('是否退出(y/n)').strip() # 是否退出
    if len(cmd)==0:
        continue
    if cmd=='y' or cmd=='Y': # 退出交流
        break
    c.send(cmd.encode()) # 发送信息
    cmd_res=c.recv(1024) # 接收信息
    print(cmd_res.decode()) # 打印信息
c.close() # 关闭

相关文章
|
5天前
|
缓存 监控 Java
Java Socket编程最佳实践:优化客户端-服务器通信性能
【6月更文挑战第21天】Java Socket编程优化涉及识别性能瓶颈,如网络延迟和CPU计算。使用非阻塞I/O(NIO)和多路复用技术提升并发处理能力,减少线程上下文切换。缓存利用可减少I/O操作,异步I/O(AIO)进一步提高效率。持续监控系统性能是关键。通过实践这些策略,开发者能构建高效稳定的通信系统。
|
3天前
|
机器学习/深度学习 人工智能 算法
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
海洋生物识别系统。以Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经网络算法,通过对22种常见的海洋生物('蛤蜊', '珊瑚', '螃蟹', '海豚', '鳗鱼', '水母', '龙虾', '海蛞蝓', '章鱼', '水獭', '企鹅', '河豚', '魔鬼鱼', '海胆', '海马', '海豹', '鲨鱼', '虾', '鱿鱼', '海星', '海龟', '鲸鱼')数据集进行训练,得到一个识别精度较高的模型文件,然后使用Django开发一个Web网页平台操作界面,实现用户上传一张海洋生物图片识别其名称。
69 7
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
|
5天前
|
Java 数据挖掘 开发者
Java网络编程进阶:Socket通信的高级特性与应用
【6月更文挑战第21天】Java Socket通信是分布式应用的基础,涉及高级特性如多路复用(Selector)和零拷贝,提升效率与响应速度。结合NIO和AIO,适用于高并发场景如游戏服务器和实时数据分析。示例展示了基于NIO的多路复用服务器实现。随着技术发展,WebSockets、HTTP/2、QUIC等新协议正变革网络通信,掌握Socket高级特性为应对未来挑战准备。
|
5天前
|
Java
Java Socket编程与多线程:提升客户端-服务器通信的并发性能
【6月更文挑战第21天】Java网络编程中,Socket结合多线程提升并发性能,服务器对每个客户端连接启动新线程处理,如示例所示,实现每个客户端的独立操作。多线程利用多核处理器能力,避免串行等待,提升响应速度。防止死锁需减少共享资源,统一锁定顺序,使用超时和重试策略。使用synchronized、ReentrantLock等维持数据一致性。多线程带来性能提升的同时,也伴随复杂性和挑战。
|
5天前
|
安全 Java 网络安全
Java Socket编程教程:构建安全可靠的客户端-服务器通信
【6月更文挑战第21天】构建安全的Java Socket通信涉及SSL/TLS加密、异常处理和重连策略。示例中,`SecureServer`使用SSLServerSocketFactory创建加密连接,而`ReliableClient`展示异常捕获与自动重连。理解安全意识,如防数据截获和中间人攻击,是首要步骤。通过良好的编程实践,确保网络应用在复杂环境中稳定且安全。
|
2天前
|
网络协议 程序员 数据安全/隐私保护
socket编程原理
socket编程原理
125 59
|
3天前
|
机器学习/深度学习 人工智能 算法
【昆虫识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+机器学习+TensorFlow+ResNet50
昆虫识别系统,使用Python作为主要开发语言。通过TensorFlow搭建ResNet50卷积神经网络算法(CNN)模型。通过对10种常见的昆虫图片数据集('蜜蜂', '甲虫', '蝴蝶', '蝉', '蜻蜓', '蚱蜢', '蛾', '蝎子', '蜗牛', '蜘蛛')进行训练,得到一个识别精度较高的H5格式模型文件,然后使用Django搭建Web网页端可视化操作界面,实现用户上传一张昆虫图片识别其名称。
87 7
【昆虫识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+机器学习+TensorFlow+ResNet50
|
3天前
|
机器学习/深度学习 人工智能 算法
【球类识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+TensorFlow
球类识别系统,本系统使用Python作为主要编程语言,基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集 '美式足球', '棒球', '篮球', '台球', '保龄球', '板球', '足球', '高尔夫球', '曲棍球', '冰球', '橄榄球', '羽毛球', '乒乓球', '网球', '排球'等15种常见的球类图像作为数据集,然后进行训练,最终得到一个识别精度较高的模型文件。再使用Django开发Web网页端可视化界面平台,实现用户上传一张球类图片识别其名称。
78 7
【球类识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+TensorFlow
|
1天前
|
数据采集 机器学习/深度学习 数据可视化
利用Python进行网络爬虫和数据抓取
在当今数字化时代,数据是无处不在的。从市场趋势到个人偏好,从社交媒体活动到商业智能,数据扮演着关键的角色。然而,访问、处理和利用数据并不总是轻而易举的。幸运的是,Python提供了一套强大而灵活的工具,使得网络爬虫和数据抓取成为可能。本文将深入探讨如何利用Python进行网络爬虫和数据抓取,为您打开数据世界的大门。
|
1天前
|
Java 机器人 大数据
如何在Java中进行网络编程:Socket与NIO
如何在Java中进行网络编程:Socket与NIO

热门文章

最新文章