热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python开发之路socketserver

1.socketserver实现并发服务端:importsocketserverclassMyserver(socketserver.BaseRequestHandler):#来一

1.socket server实现并发

服务端:

import socketserver

class Myserver(socketserver.BaseRequestHandler):  #来一个链接产生一个实例
    def handle(self):  #定义了一个通信循环的功能
        print(conn是:,self.request)  #相当于conn  既accept接收到的连接
        print(self.client_address) #相当于addr 既accept接收到的addr地址
        while True:
            try:
                #收消息
                data = self.request.recv(1024)
                if not data: break
                print(收到客户端的消息是:,data,self.client_address)

                #发消息
                self.request.sendall(data.upper())
            except Exception as e:
                print(e)
                break

if __name__ == __main__:
    s = socketserver.ThreadingTCPServer((127.0.0.1,8000),Myserver) #多线程的TCP服务端 第一个参数是IP和端口 第二个参数相当于把通信循环加进去了
    s.serve_forever()  #这两项相当于实现了链接循环 只要有链接进来 直接进入通信循环 执行myserver下的handle方法

UDP版本:
#UDP版本
class Myserver(socketserver.BaseRequestHandler): #来一个链接产生一个实例
def handle(self): #定义了一个通信循环的功能
while True:
data = self.request[0]
print(data)
self.request[1].sendto(self.request[0].upper(),self.client_address)
 

2.socketserver模块

socketserver中两大类:第一类:server类,处理链接 第二类:request类,处理通信

server类:

技术图片

 request类:

技术图片

继承关系:

+------------+
| BaseServer |
+------------+
|
v
+-----------+ +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+ +------------------+
|
v
+-----------+ +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+ +--------------------+

技术图片

技术图片

Forking:进程

Threading:线程

对于TCP来说,self.request = conn 

对于UDP来说,self.request = (data_bytes,UDP的套接字对象)

FTP:文件传输协议

技术图片

3.认证客户端链接的合法性

利用hmac+加盐的方式来实现

客户端:

#_*_coding:utf-8_*_
__author__ = Linhaifeng
from socket import *
import hmac,os

secret_key=blinhaifeng bang bang bang
def conn_auth(conn):
    ‘‘‘
    认证客户端链接
    :param conn:
    :return:
    ‘‘‘
    print(开始验证新链接的合法性)
    msg=os.urandom(32)
    conn.sendall(msg)
    h=hmac.new(secret_key,msg)  #将盐和随机产生的32位数组合生成一个新值
    digest=h.digest() #将新值转化为数字
    respOne=conn.recv(len(digest)) #接收与数字同等长度的值
    return hmac.compare_digest(respone,digest) #将接收到的值和自己的值做比较,返回一个True或False

def data_handler(conn,bufsize=1024):
    if not conn_auth(conn):
        print(该链接不合法,关闭)
        conn.close()
        return
    print(链接合法,开始通信)
    while True:
        data=conn.recv(bufsize)
        if not data:break
        conn.sendall(data.upper())

def server_handler(ip_port,bufsize,backlog=5):
    ‘‘‘
    只处理链接
:param ip_port: :return:
‘‘‘ tcp_socket_server=socket(AF_INET,SOCK_STREAM) tcp_socket_server.bind(ip_port) tcp_socket_server.listen(backlog) while True: conn,addr=tcp_socket_server.accept() print(新连接[%s:%s] %(addr[0],addr[1])) data_handler(conn,bufsize) if __name__ == __main__: ip_port=(127.0.0.1,9999) bufsize=1024 server_handler(ip_port,bufsize)

客户端:

技术图片技术图片
#_*_coding:utf-8_*_
__author__ = Linhaifeng
from socket import *
import hmac,os

secret_key=blinhaifeng bang bang bang
def conn_auth(conn):
    ‘‘‘
    验证客户端到服务器的链接
    :param conn:
    :return:
    ‘‘‘
    msg=conn.recv(32)
    h=hmac.new(secret_key,msg)
    digest=h.digest()
    conn.sendall(digest)

def client_handler(ip_port,bufsize=1024):
    tcp_socket_client=socket(AF_INET,SOCK_STREAM)
    tcp_socket_client.connect(ip_port)

    conn_auth(tcp_socket_client)

    while True:
        data=input(>>: ).strip()
        if not data:continue
        if data == quit:break

        tcp_socket_client.sendall(data.encode(utf-8))
        respone=tcp_socket_client.recv(bufsize)
        print(respone.decode(utf-8))
    tcp_socket_client.close()

if __name__ == __main__:
    ip_port=(127.0.0.1,9999)
    bufsize=1024
    client_handler(ip_port,bufsize)
客户端

Python开发之路-socket server


推荐阅读
  • iOS snow animation
    CTSnowAnimationView.hCTMyCtripCreatedbyalexon1614.Copyright©2016年ctrip.Allrightsreserved.# ... [详细]
  • Python学习day3网络基础之网络协议篇
    一、互联网协议连接两台计算机之间的Internet实际上就是一系列统一的标准,这些标准称之为互联网协议,互联网的本质就是一系列网络协议。二、为什么要有互联网协议互联网协议就相当于计 ... [详细]
  • Java EE 平台集成了多种服务、API 和协议,旨在支持基于 Web 的多层应用程序开发。本文将详细介绍 Java EE 中的 13 种关键技术规范,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • packagecom.panchan.tsmese.utils;importjava.lang.reflect.ParameterizedType;importjava.lang. ... [详细]
  • 申请地址:https://developer.apple.com/appstore/contact/?topic=expedite 常见申请理由:1. 我们即将发布新产品,这是一个媒体活动,我们无法承担任何风险,因此在多个方面努力提升应用质量。 ... [详细]
  • 本文介绍了如何使用线段树实现区间加法和区间查询操作,包括详细的代码实现和解释。 ... [详细]
  • 线段树,注 ... [详细]
  • JavaSE For循环入门示例
    本文将介绍Java中For循环的基本概念和使用方法,通过几个简单的示例帮助初学者更好地理解和掌握For循环。 ... [详细]
  • 本文介绍了如何使用Python爬取妙笔阁小说网仙侠系列中所有小说的信息,并将其保存为TXT和CSV格式。主要内容包括如何构造请求头以避免被网站封禁,以及如何利用XPath解析HTML并提取所需信息。 ... [详细]
  • 本文详细探讨了使用Python3编写爬虫时如何应对网站的反爬虫机制,通过实例讲解了如何模拟浏览器访问,帮助读者更好地理解和应用相关技术。 ... [详细]
  • 蒜头君的倒水问题(矩阵快速幂优化)
    蒜头君将两杯热水分别倒入两个杯子中,每杯水的初始量分别为a毫升和b毫升。为了使水冷却,蒜头君采用了一种特殊的方式,即每次将第一杯中的x%的水倒入第二杯,同时将第二杯中的y%的水倒入第一杯。这种操作会重复进行k次,最终求出两杯水中各自的水量。 ... [详细]
  • 本文将介绍如何利用Python从西门子PLC获取数据,并通过Web技术实现数据的可视化。我们将探讨所需的技术栈和具体步骤。 ... [详细]
  • 说明Python教程正在编写中,欢迎大家加微信sinbam提供意见、建议、纠错、催更。drymail是一个邮件发送库,封装了Python的smtplib ... [详细]
  • 使用Tkinter构建51Ape无损音乐爬虫UI
    本文介绍了如何使用Python的内置模块Tkinter来构建一个简单的用户界面,用于爬取51Ape网站上的无损音乐百度云链接。虽然Tkinter入门相对简单,但在实际开发过程中由于文档不足可能会带来一些不便。 ... [详细]
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
author-avatar
饱和深潜者_463
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有