网上测试了很多关于PYTHON的WEBSOCKET样例,下面这个才成功了

简介:

这是最底层的,

嘿嘿,我 还是习惯搞个框架来实现急需要的功能。。。

这个东东玩得很有意思的。。

服务器端的代码:

复制代码
import simplejson
import socket
import sys
import base64
import hashlib
import time

HOST = '127.0.0.1'
PORT = 9000
MAGIC_STRING = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
HANDSHAKE_STRING = "HTTP/1.1 101 Switching Protocols\r\n" \
    "Upgrade:WebSocket\r\n" \
    "Connection: Upgrade\r\n" \
    "Sec-WebSocket-Accept: {1}\r\n" \
    "WebSocket-Location: ws://{2}/chat\r\n" \
    "WebSocket-Protocol:chat\r\n\r\n"

def parse_data(msg):
    v = ord(msg[1]) & 0x7f
    if v == 0x7e:
        p = 4
    elif v == 0x7f:
        p = 10
    else:
        p = 2

    mask = msg[p:p+4]
    data = msg[p+4:]

    return ''.join([chr(ord(v) ^ ord(mask[k%4])) for k, v in enumerate(data)])

def start():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    try:
        sock.bind((HOST, PORT))
        sock.listen(100)
    except Exception as e:
        print('bind error')
        print(e)
        sys.exit()

    while True:
        conn, add = sock.accept()

        try:
            handshake(conn)
        finally:
            print('finally')
            conn.close()

    sock.close()
    pass

def handshake(conn):
    headers = {}
    shake = conn.recv(1024)

    print shake

    if not len(shake):
        print('len error')
        return False

    header, data = shake.split('\r\n\r\n', 1)
    for line in header.split('\r\n')[1:]:
        key, value = line.split(': ', 1)
        headers[key] = value

    if 'Sec-WebSocket-Key' not in headers:
        print('this is not websocket, client close.')
        print headers
        conn.close()

        return False

    sec_key = headers['Sec-WebSocket-Key']
    res_key = base64.b64encode(hashlib.sha1(sec_key + MAGIC_STRING).digest())

    str_handshke = HANDSHAKE_STRING.replace('{1}', res_key).replace('{2}', HOST + ":" + str(PORT))
    print str_handshke

    conn.send(str_handshke)
    time.sleep(1)
    conn.send('%c%c%s' % (0x81, 6, 'suren1'))
    msg = conn.recv(1024)
    msg = parse_data(msg)
    print('msg : ' + msg)

    time.sleep(1)
    conn.send('%c%c%s' % (0x81, 6, 'suren2'))
    msg = conn.recv(1024)
    msg = parse_data(msg)
    print('msg : ' + msg)

    time.sleep(1)
    conn.send('%c%c%s' % (0x81, 6, 'suren3'))
    msg = conn.recv(1024)
    msg = parse_data(msg)
    print('msg : ' + msg)

    return True

    pass

if __name__ == '__main__':
    try:
        start()
    except Exception as e:
        print(e)
复制代码

 

浏览器端的代码:

复制代码
<html> <head>
<script type="text/javascript">
var socket = new WebSocket('ws://127.0.0.1:9000');

socket.onopen = function(e)
{
    console.log('onopen : ' + e);
        var element = document.getElementById("holder"); 
        element.innerHTML +=  'onopen : '
        element.innerHTML +=  e;
        element.innerHTML +=  "<br>";
}

socket.onclose = function(e)
{
    console.log('onclose : ' + e + '; length : ' + arguments.length);
        var element = document.getElementById("holder"); 
        element.innerHTML +=  'close : '
        element.innerHTML +=  e;
        element.innerHTML +=  "<br>";
}

socket.onmessage = function(e)
{
    console.log('onmessage : ' + e + '; length : ' + arguments.length);
    console.log('data : ' + e.data);
    socket.send('chengang');
        var element = document.getElementById("holder"); 
        element.innerHTML +=  'onmessage : '
        element.innerHTML +=  e
        element.innerHTML +=  "<br>";
        element.innerHTML +=  'data : '
        element.innerHTML +=  e.data;
        element.innerHTML +=  "<br>";
}
</script>
</head> <body>
<div id="holder" style="width:600px; height:300px"></div>

 </body> </html>
复制代码

 

效果图:

今天学习完工,应该是家庭,电影,小说的时间啦啦。。。

目录
相关文章
|
5天前
|
监控 测试技术 持续交付
Python自动化测试代理程序可用性
总之,通过编写测试用例、自动化测试和设置监控系统,您可以确保Python自动化测试代理程序的可用性,并及时发现和解决问题。这有助于提供更可靠和高性能的代理服务。
11 4
|
8天前
|
机器学习/深度学习 算法 UED
【Python 机器学习专栏】A/B 测试在机器学习项目中的应用
【4月更文挑战第30天】A/B测试在数据驱动的机器学习项目中扮演关键角色,用于评估模型性能、算法改进和特征选择。通过定义目标、划分群组、实施处理、收集数据和分析结果,A/B测试能帮助优化模型和用户体验。Python提供工具如pandas和scipy.stats支持实验实施与分析。注意样本量、随机性、时间因素和多变量分析,确保测试有效性。A/B测试助力于持续改进机器学习项目,实现更好的成果。
|
9天前
|
测试技术 Python
python运行集成测试
【4月更文挑战第22天】
8 1
|
9天前
|
测试技术 Python
python编写集成测试
【4月更文挑战第22天】
4 1
|
10天前
|
数据可视化 测试技术 持续交付
python分析测试结果
【4月更文挑战第21天】
19 3
|
10天前
|
XML 测试技术 持续交付
python运行集成测试
【4月更文挑战第21天】
20 2
|
10天前
|
测试技术 Python
python编写集成测试用例
【4月更文挑战第21天】
17 1
|
11天前
|
IDE 测试技术 持续交付
【专栏】Python自动化测试与单元测试框架:提升代码质量与效率
【4月更文挑战第27天】本文探讨了Python自动化测试与单元测试框架在提升代码质量与效率中的作用。Selenium、Appium用于Web和移动应用自动化测试,pytest提供强大、易扩展的测试支持。unittest是Python标准的单元测试框架,支持结构化测试用例和丰富的断言。实践中,应制定测试计划,编写高质量测试用例,实行持续集成与测试,并充分利用测试报告。这些工具和策略能有效保障代码质量和提升开发效率。
|
11天前
|
测试技术 API 持续交付
【专栏】Python自动化测试与单元测试框架
【4月更文挑战第27天】本文探讨了Python在自动化测试与单元测试中的应用,强调其简洁语法和丰富库的优势。文章分为三部分:首先,阐述自动化测试的重要性及Python的易学性、库支持、跨平台和社区支持;其次,介绍了Python的Unittest标准测试框架和Pytest第三方框架的特点与用法;最后,讨论了Web UI和API自动化测试实践,并提出持续集成、测试金字塔等最佳实践。Python为软件开发的测试环节提供了强大支持,帮助构建更稳定的系统。
|
12天前
|
Web App开发 人工智能 Java
Python Selenium实现自动化测试及Chrome驱动使用
Python Selenium实现自动化测试及Chrome驱动使用
11 2