python,网络编程

简介: 基于网络通信的编程

网络知识补充

1、CS架构与BS架构
    CS:客户端,服务端
    BS:浏览器,服务器

2、tcp 三次握手,四次挥手
![img](https://images2015.cnblogs.com/blog/1036857/201610/1036857-20161008185648160-191189690.png)

3、数据包传输过程
![img](https://img2020.cnblogs.com/blog/1036857/202004/1036857-20200415215541847-564448301.gif)

基于TCP协议的套接字

server端:

from socket import *
phone = socket(AF_INET,SOCK_STREAM)     #创建服务器套接字
phone.bind(('127.0.0.1',8899))        #把地址绑定到套接字
phone.listen(5)                        #监听链接,括号内为指定半连接数
while True:
    conn,client_add = phone.accept()    #接受客户端链接,conn表示连接,client表示客户端ip和端口
    print(conn)
    print('客户端的ip和端口',client_add)
    
#conn.close()    #关闭当前连接
#phone.close()            # 关闭套接字服务器




client端:

from socket import *
phone = socket(AF_INET,SOCK_STREAM)        #创建服务器套接字
phone.connect(('127.0.0.1',8899))        #设置连接地址

while True:
    msg = input('请输入命令:').strip()
    if len(msg) == 0:
        continue
    phone.send(msg.encode('utf-8'))        #设置发送的数据
    data = phone.recv(1024)                #设置接收的数据
    print('接收到服务器发来的:',data.decode('utf-8'))
phone.close()    #关闭当前连接

基于UDP协议的套接字

服务器:
from socket import *
phone = socket(AF_INET,SOCK_DGRAM)
while True:
    choice = input('请输入传输内容:').strip()
    phone.sendto(choice.encode('utf-8'),('127.0.0.1',8081))
    func=phone.recv(1024)
    print(func.decode('utf-8'))
    # phone.close()


客户端
from socket import *
phone = socket(AF_INET,SOCK_DGRAM)
while True:
    choice = input('请输入传输内容:').strip()
    phone.sendto(choice.encode('utf-8'),('127.0.0.1',8081))
    func=phone.recv(1024)
    print(func.decode('utf-8'))
    # phone.close()                  

TCP沾包问题 and 远程执行命令功能

服务端:
import json
import struct
from socket import *
import subprocess
import string
import _json


phone = socket(AF_INET,SOCK_STREAM)
phone.bind(('127.0.0.1',8899))
phone.listen(5)

while True:
        conn,client_add = phone.accept()
        while True:
            try:
                cmd = conn.recv(1024)
                if len(cmd) ==0:
                    break
                obj = subprocess.Popen(
                    cmd.decode('utf-8'),
                    shell = True,
                    stdout=subprocess.PIPE,
                    stderr=subprocess.PIPE,
                )

                stdout_res = obj.stdout.read()
                stderr_res = obj.stderr.read()
                total_size = len(stderr_res) + len(stdout_res)
                header_dir = {
                    "filename":'a.txt',
                    "total_size":total_size,
                    "md5":'123123ass123'
                }

            #服务端:
                #1、制作头
                # 将字典转化成json格式的字符串,然后在转化为bytes,然后将其打入到header_size里
                json_str = json.dumps(header_dir)
                json_str_bytes = json_str.encode('utf-8')
                x = struct.pack('i',len(json_str_bytes))

                #2、将头的长度发送过去
                conn.send(x)

                #3、传输头信息
                conn.send(json_str_bytes)

                #4、最后发送真时数据
                conn.send(stdout_res)
                conn.send(stderr_res)

            #接收端
                #1、先收4个字,从中提取下来要收的头的长度
                #2、json_str_bytes = recv (头的长度)
                #   json_str=json_str_bytes.decode('utf-8')
                #   header_dic = json.loads(json_str)
                #   print(header_dic)
                #   total_size = header_dic["total_size"]
                #3、接收真正的数据

            except Exception:
                break
        # conn.close()
        
        
客户端:
import struct
from socket import *
import json
client = socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1',8899))

while True:
    cmd = input('请输入命令:').strip()
    if len(cmd) == 0:
        continue
    client.send(cmd.encode('utf-8'))

    # 1、先收4个字,从中提取下来要收的头的长度
    x=client.recv(4)
    if not len(x) == 4:
        continue
    header_len = struct.unpack('i',x)[0]     #将拿到的4个集字节进行反解
    # 2、接收头并解析
    json_str_bytes = client.recv (header_len)
    json_str=json_str_bytes.decode('utf-8')
    header_dic = json.loads(json_str)
    print(header_dic)
    total_size = header_dic["total_size"]
    # 3、接收真正的数据
    recv_size = 0
    while recv_size < total_size:
        recv_data = client.recv(1024)
        recv_size += len(recv_data)
        print(recv_data.decode('gbk'),end='')
    else:
        print()

socketserver多并发

基于TCP
#服务端
import socketserver
class MyRequestHandle(socketserver.BaseRequestHandler):
    def handle(self):
        print(self.request) #如果tcp协议,self.request=>conn
        print(self.client_address)
        while True:
            try:
                data = self.request.recv(1024)
                if len(data) == 0:
                    break
                self.request.send(data.upper())
            except Exception:
                break
        self.request.close

#相当于循环的从半连接池中取出连接请求建立双向连接,拿到连接对象
s = socketserver.ThreadingTCPServer(('127.0.0.1',8888),MyRequestHandle)
s.serve_forever()       #这个函数会建连接,每建立一个连接则生成一个进程来处理

#客户端
from socket import *
phone = socket(AF_INET,SOCK_STREAM)
phone.connect(('127.0.0.1',8888))

while True:
    msg = input('请输入命令:').strip()
    if len(msg) == 0:
        continue
    phone.send(msg.encode('utf-8'))
    data = phone.recv(1024)
    print('接收到服务器发来的:',data.decode('utf-8'))
phone.close()
基于UDP
#客户端
from socket import *
phone = socket(AF_INET,SOCK_DGRAM)
while True:
    choice = input('请输入传输内容:').strip()
    phone.sendto(choice.encode('utf-8'),('127.0.0.1',8888))
    func=phone.recvfrom(1024)
    print(func)
    # phone.close()
    
    
#服务端
import socketserver
class MyRequestHandle(socketserver.BaseRequestHandler):
    def handle(self):
        client_data = self.request[0]
        server = self.request[1]
        client_add = self.client_address
        print('客户端发来的数据%s'%client_data)
        server.sendto(client_data.upper(),client_add)



s = socketserver.ThreadingUDPServer(('127.0.0.1',8888),MyRequestHandle)
s.serve_forever()


#相当于:只负责循环的收,收到后交给小弟去处理
相关文章
|
21天前
|
搜索推荐 程序员 调度
精通Python异步编程:利用Asyncio与Aiohttp构建高效网络应用
【10月更文挑战第5天】随着互联网技术的快速发展,用户对于网络应用的响应速度和服务质量提出了越来越高的要求。为了构建能够处理高并发请求、提供快速响应时间的应用程序,开发者们需要掌握高效的编程技术和框架。在Python语言中,`asyncio` 和 `aiohttp` 是两个非常强大的库,它们可以帮助我们编写出既简洁又高效的异步网络应用。
99 1
|
1月前
|
数据采集 存储 JavaScript
构建你的第一个Python网络爬虫
【9月更文挑战第34天】在数字信息泛滥的时代,快速有效地获取和处理数据成为一项重要技能。本文将引导读者通过Python编写一个简易的网络爬虫,实现自动化地从网页上抓取数据。我们将一步步走过代码的编写过程,并探讨如何避免常见陷阱。无论你是编程新手还是想扩展你的技术工具箱,这篇文章都将为你提供有价值的指导。
71 18
|
1天前
|
数据采集 存储 机器学习/深度学习
构建高效的Python网络爬虫
【10月更文挑战第25天】本文将引导你通过Python编程语言实现一个高效网络爬虫。我们将从基础的爬虫概念出发,逐步讲解如何利用Python强大的库和框架来爬取、解析网页数据,以及存储和管理这些数据。文章旨在为初学者提供一个清晰的爬虫开发路径,同时为有经验的开发者提供一些高级技巧。
5 1
|
3天前
|
Kubernetes 网络协议 Python
Python网络编程:从Socket到Web应用
在信息时代,网络编程是软件开发的重要组成部分。Python作为多用途编程语言,提供了从Socket编程到Web应用开发的强大支持。本文将从基础的Socket编程入手,逐步深入到复杂的Web应用开发,涵盖Flask、Django等框架的应用,以及异步Web编程和微服务架构。通过本文,读者将全面了解Python在网络编程领域的应用。
6 1
|
4天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
12 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
12天前
|
消息中间件 监控 网络协议
Python中的Socket魔法:如何利用socket模块构建强大的网络通信
本文介绍了Python的`socket`模块,讲解了其基本概念、语法和使用方法。通过简单的TCP服务器和客户端示例,展示了如何创建、绑定、监听、接受连接及发送/接收数据。进一步探讨了多用户聊天室的实现,并介绍了非阻塞IO和多路复用技术以提高并发处理能力。最后,讨论了`socket`模块在现代网络编程中的应用及其与其他通信方式的关系。
|
17天前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
38 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
23天前
|
运维 监控 网络安全
Python 在网络运维方面的自动化应用实例
Python 在网络运维方面的自动化应用实例
49 4
|
2月前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
79 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
2月前
|
机器学习/深度学习 数据采集 网络安全
使用Python实现深度学习模型:智能网络安全威胁检测
使用Python实现深度学习模型:智能网络安全威胁检测
138 5