Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >用Python实现一个简易的WebSoc

用Python实现一个简易的WebSoc

作者头像
py3study
发布于 2020-01-08 08:19:06
发布于 2020-01-08 08:19:06
44000
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
</pre><pre name="code" class="python">#coding=utf-8

from threading import Thread
import struct
import time
import hashlib
import base64
import socket
import time  

class returnCrossDomain(Thread):  
    def __init__(self,connection):  
        Thread.__init__(self)  
        self.con = connection  
        self.isHandleShake = False  
    def run(self):  
        while True:  
            if not self.isHandleShake: 
                #开始握手阶段
                header = self.analyzeReq()
                secKey = header['Sec-WebSocket-Key'];  

                acceptKey = self.generateAcceptKey(secKey)

                response = "HTTP/1.1 101 Switching Protocols\r\n"  
                response += "Upgrade: websocket\r\n"  
                response += "Connection: Upgrade\r\n" 
                response += "Sec-WebSocket-Accept: %s\r\n\r\n"%(acceptKey.decode('utf-8'))  
                self.con.send(response.encode())  
                self.isHandleShake = True  
                print('response:\r\n'+response)
                #握手阶段结束
            else:  
                #接受客户端数据
                opcode = self.getOpcode()  
                if opcode == 8:
                    self.con.close()
                self.getDataLength()
                clientData = self.readClientData()
                print('客户端数据:'+clientData)
                #向客户端发送数据
                self.sendDataToClient('hello world')


    def analyzeReq(self):
        reqData = self.con.recv(1024).decode()
        reqList = reqData.split('\r\n')
        headers = {}
        for reqItem in reqList:
            if ': ' in reqItem:
                unit = reqItem.split(': ')
                headers[unit[0]] = unit[1]
        return headers

    def generateAcceptKey(self,secKey):
        sha1 = hashlib.sha1()
        sha1.update((secKey+'258EAFA5-E914-47DA-95CA-C5AB0DC85B11').encode())
        sha1_result = sha1.digest()
        acceptKey = base64.b64encode(sha1_result)
        return acceptKey

    def getOpcode(self):
        first8Bit = self.con.recv(1)
        first8Bit = struct.unpack('B',first8Bit)[0]
        opcode = first8Bit & 0b00001111
        return opcode

    def getDataLength(self):
        second8Bit = self.con.recv(1)
        second8Bit = struct.unpack('B',second8Bit)[0]
        masking = second8Bit >> 7
        dataLength = second8Bit & 0b01111111

        if dataLength <= 125:
            payDataLength = dataLength
        elif dataLength == 126:
            payDataLength = struct.unpack('H',self.con.recv(2))[0]
        elif dataLength == 127:
            payDataLength = struct.unpack('Q',self.con.recv(8))[0]
        self.masking = masking
        self.payDataLength = payDataLength

    def readClientData(self):
        if self.masking == 1:
            maskingKey = self.con.recv(4)

        data = self.con.recv(self.payDataLength)

        if self.masking == 1:
            i = 0
            trueData = ''
            for d in data:
                trueData += chr(d ^ maskingKey[i%4])
                i += 1
            return trueData
        else:
            return data

    def sendDataToClient(self,text):
        sendData = ''
        sendData = struct.pack('!B',0x81)
   
        length = len(text)
        if length <= 125:
            sendData += struct.pack('!B',length)
        elif length <= 65536:
            sendData += struct.pack('!B',126)
            sendData += struct.pack('!H',length)
        elif length == 127:
            sendData += struct.pack('!B',127)
            sendData += struct.pack('!Q',length)

        sendData += struct.pack('!%ds' % (length),text.encode())
        dataSize = self.con.send(sendData)

  
def main():  
    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  
    sock.bind(('127.0.0.1',88))  
    sock.listen(5)  
    while True:  
        try:  
            connection,address = sock.accept()  
            returnCrossDomain(connection).start()  
        except:  
            time.sleep(1)  
  
if __name__=="__main__":  
    main()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/09/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
electron桌面应用开发(六)
前言electron的地位electron中js通过web socket与python通信效果图参考一番今日
efonfighting
2019/10/15
2K0
electron桌面应用开发(六)
用Python实现一个简单的WebSoc
windows python 2.79, chrome37 firefox35通过
py3study
2020/01/06
5290
WebSocket相关
原文:http://www.cnblogs.com/jinjiangongzuoshi/p/5062092.html 前言 今天看了一些资料,记录一下心得。 websocket是html5引入的一个新特性,传统的web应用是通过http协议来提供支持,如果要实时同步传输数据,需要轮询,效率低下 websocket是类似socket通信,web端连接服务器后,握手成功,一直保持连接,可以理解为长连接,这时服务器就可以主动给客户端发送数据,实现数据的自动更新。 使用websocket需要注意浏览器和当前的
新人小试
2018/07/05
5450
MYSQL连接协议解析 并使用PYTHON模拟连接
了解了mysql的连接协议后, 就可以直接写mysql连接(驱动)了, 就可以模拟mysql client去连接数据库了, 还能模拟mysql服务端, 就可以制作mysql中间件来做读写分离, 分布式数据库 之类的了. 不过本文不会讲到那么多.
大大刺猬
2023/03/19
2K0
MYSQL连接协议解析  并使用PYTHON模拟连接
一文读懂 WebSocket 通信过程与实现
来源:Python那些事 ID:PythonSomething 什么是 WebSocket ? WebSocket 是一种标准协议,用于在客户端和服务端之间进行双向数据传输。但它跟 HTTP 没什么关系,它是一种基于 TCP 的一种独立实现。 以前客户端想知道服务端的处理进度,要不停地使用 Ajax 进行轮询,让浏览器隔个几秒就向服务器发一次请求,这对服务器压力较高。另外一种轮询就是采用 long poll 的方式,这就跟打电话差不多,没收到消息就一直不挂电话,也就是说,客户端发起连接后,如果没消息,就一
小小科
2018/06/20
2.2K0
技术分享 | 连接数据库这个操作做了什么?
MySQL DBA,擅长 python 和 SQL,目前维护着 github 的两个开源项目:mysqltools 、dbmc 以及独立博客:https://www.sqlpy.com。
爱可生开源社区
2020/06/12
3840
一文读懂 WebSocket 通信过程与实现
WebSocket 是一种标准协议,用于在客户端和服务端之间进行双向数据传输。但它跟 HTTP 没什么关系,它是一种基于 TCP 的一种独立实现。
前端教程
2018/07/27
6700
一文读懂 WebSocket 通信过程与实现
Python UDP 协议网络编程《三》
TFTP 是一个传输文件的简单协议,它基于UDP协议而实现。 TFTP (Trivial File Transfer Protocol):简称文件传输协议。 TFTP 是TCP/IP协议族中的一个用来在客户端与服务器之间进行简单文件传输的协议,传输不复杂、开销不大的文件。端口号固定为69。
Wu_Candy
2022/07/04
4450
Python UDP 协议网络编程《三》
连接MYSQL后, 怎样发送SQL和接收数据? (含python)
如果你看了 上一章 , 那你应该就明白了Mysql连接的时候都干了啥, 但是光连上也没啥用啊, 要发送SQL,接收server发来的数据.
大大刺猬
2023/03/20
1.7K0
连接MYSQL后, 怎样发送SQL和接收数据? (含python)
MYSQL caching_sha2_password 加密原理和连接过程(FULL)
本文主要讲caching_sha2_password的加密原理和连接过程(比mysql_native_password复杂一些)
大大刺猬
2023/03/28
2.8K0
MYSQL caching_sha2_password 加密原理和连接过程(FULL)
面向对象之套接字(socket)和黏包
 一丶套接字(socket)   tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端   基于UDP协议的socket   server端: import socket udp_sk = socket.socket(type=socket.SOCK_DGRAM) #创建一个服务器的套接字 udp_sk.bind(('127.0.0.1',9000)) #绑定服务器套接字 msg,addr = udp_sk.recvfrom(1024) print(msg) udp_sk.s
py3study
2020/01/19
5770
面向对象之套接字(socket)和黏包
[MYSQL] 自定义mysql脱敏中间件 -- 对指定连接进行指定字段的数据脱敏
昨天群友有这么一个需求: 对应特定的连接查询特定的表字段的时候,对其进行脱敏. 比如: select name, phone from tblname where id=xxx 查询出来的phone需要是脱敏的.即显示为:152****6666这种样子.
大大刺猬
2025/04/08
1990
[MYSQL] 自定义mysql脱敏中间件 -- 对指定连接进行指定字段的数据脱敏
搭建TCP/UDP协议的中间人环境
无论是传统的网络协议调试与分析,还是漏洞分析,一个能够对数据包进行实时的监控、拦截以及篡改的中间人位置通常是很有帮助的。对于HTTP/HTTPS等上层协议来讲,中间人位置的构造并不复杂,现有的利用http代理配合很多工具如burpsuite/mitmproxy/fildder都可以帮助我们完成这一个工作。然而,对于TCP/UDP协议来说,由于缺少工具和解决方案,构造一个中间人位置并不是那么简单明了。
Atum
2022/12/22
6590
腾讯云CDN支持WebSocket
Websocket是用于服务端主动向客户端推送消息的技术。传统的HTTP/HTTPS只能由客户端向服务端发起请求,服务端对请求一一响应。在需要获取服务端状态变化的场景下,如:提交的后台任务是否执行成功,只能通过客户端轮询向服务端发起请求,不仅效率低,还浪费资源(HTTP1.0下每次轮询都需要经过TCP三次握手重新建立连接)。而WebSocket的出现较好的解决了这个问题,在TCP首次建立完连接之后,该连接不自动关闭,在有效期内客户端可以继续向服务端发送消息,服务端也能主动给客户端发送消息。
yaho
2020/05/02
24K0
腾讯云CDN支持WebSocket
Python TCP Socket的粘包和分包的处理
在进行TCP Socket开发时,都需要处理数据包粘包和分包的情况。本文详细讲解解决该问题的步骤。使用的语言是Python。实际上解决该问题很简单,在应用层下,定义一个协议:消息头部+消息长度+消息正文即可。
緣來
2020/01/02
5.1K0
python socks5 proxy实
zz http://www.ietf.org/rfc/rfc1928.txt  http://www.ietf.org/rfc/rfc1929.txt import socket, sys, select, SocketServer, struct, time class ThreadingTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): pass class Socks5Server(SocketServer.StreamReq
py3study
2020/01/10
1.4K0
Socket - 套接字编程
目录 Socket - 套接字编程 Socket 通信流程图 Socket模块 socket()方法 部分参数 bind()方法 listen()方法 accept()方法 accept()函数返回值:sock、addr connect() 方法 close()方法 服务端客户端对比 简单案例 简易通信循环 优化通信循环 黏包问题 Struct 模块 规定报头 解决黏包问题 上传文件案例 UDP通信 Socket - 套接字编程 只要涉及到远程数据交互必须要操作OSI七层模型,那么每层都需要相应的程序
HammerZe
2022/03/25
1.1K0
Socket - 套接字编程
Python之黏包的解决
黏包的解决方案 发生黏包主要是因为接收者不知道发送者发送内容的长度,因为tcp协议是根据数据流的,计算机操作系统有缓存机制, 所以当出现连续发送或连续接收的时候,发送的长度和接收的长度不匹配的情况下就
新人小试
2018/04/12
8410
Python之黏包的解决
RPC(四)
Adopt the pace of nature, her secret is patience.
小闫同学啊
2019/07/18
1.3K0
RPC(四)
Python实现局域网内屏幕广播的技术要点分析
为更好地保证教学质量和提高学生的学习积极性,我使用Python开发了一套课堂教学管理系统,具有在线点名、在线答疑、随机提问、在线作业管理、在线自测、在线考试、数据汇总、试卷生成、屏幕广播等功能,教师端
Python小屋屋主
2018/04/16
1.5K0
Python实现局域网内屏幕广播的技术要点分析
相关推荐
electron桌面应用开发(六)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档