这是最底层的,

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

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

服务器端的代码:

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>

效果图:

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

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

  1. [Python] SQLBuilder 演示样例代码

    用Python写一个SQLBuilder.Java版能够从 http://www.java2s.com/Code/Java/Database-SQL-JDBC/SQLBuilder.htm 看到. 附 ...

  2. Python 100个样例代码【爆肝整理 建议收藏】

    本教程包括 62 个基础样例,12 个核心样例,26 个习惯用法.如果觉得还不错,欢迎转发.留言. 一. Python 基础 62 例 1 十转二 将十进制转换为二进制: >>> b ...

  3. 用tornado实现一个简单的websocket样例

    想用SPRING MVC,NODE.JS EXPRESS,TORNADO实现同一个功能,开阔一下视野. 先来TORNADO的吧.. 客户端代码都差不多,主要是服务端代码. TORNADO的说法: ht ...

  4. 老猿Python部分代码样例

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 PyQt编程实战:通过eventFilter监视QScrollArea的widget()的Paint ...

  5. 某互联网后台自动化组合测试框架RF+Sikuli+Python脚本

    某互联网后台自动化组合测试框架RF+Sikuli+Python脚本 http://www.jianshu.com/p/b3e204c8651a 字数949 阅读323 评论1 喜欢0 一.**Robo ...

  6. 利用python对websocket进行并发压测

    简述 产品经理鉴于运营反馈并对程序的websocket长连接保持怀疑的态度,让我对websocket服务器进行压力测试,我内心是拒绝的. 开发思路 查阅websocket的相关资料,查到python的 ...

  7. python实现websocket服务器,可以在web实时显示远程服务器日志

    一.开始的话 使用python简单的实现websocket服务器,可以在浏览器上实时显示远程服务器的日志信息. 之前做了一个web版的发布系统,但没实现在线看日志,每次发布版本后,都需要登录到服务器上 ...

  8. python 实现websocket

    python中websocket需要我们自己实现握手代码,流程是这样:服务端启动websocket服务,并监听.当客户端连接过来时,(需要我们自己实现)服务端就接收客户端的请求数据,拿到请求头,根据请 ...

  9. HTTPS请求HTTP接口被浏览器阻塞,python实现websocket客户端,websocket服务器,跨域问题,dwebsocket,https,拦截,服务端

    HTTPS请求HTTP接口被浏览器阻塞,python实现websocket客户端,websocket服务器,跨域问题,dwebsocket,https,拦截,服务端 发表时间:2020-03-05 1 ...

随机推荐

  1. Spring 3.x 实践 第一个例子(Spring 3.x 企业应用开发实战读书笔记第二章)

    前言:工作之后一直在搞android,现在需要更多和后台的人员交涉,技术栈不一样,难免鸡同鸭讲,所以稍稍学习下. 这个例子取自于<Spring 3.x 企业应用开发实战>一书中的第二章,I ...

  2. Webbrowers控件的小技巧

    我最近接触webbrowers 这个控件比较多,感觉用起来比较顺手吧.可以做很多操作. 貌似很多网络模拟有时候都内置这个控件或者类似的控件,但这样子速度就不能跟那些单纯用API 构建数据包比了. 我一 ...

  3. android 电话拨号器

    电话拨号器(重点)            1.产品经理: 需求分析文档,设计原型图    2.UI工程师: 设计UI界面    3.架构师: 写架构,接口文档    4.码农: 服务端,客户端     ...

  4. 13_ServletContext对象

    [简介] ServletContext即Servlet上下文对象,该对象表示当前的web应用环境信息,一个Web应用只会创建一个ServletContext对象. Web容器启动的时候,它会为每个We ...

  5. extern int a[] VS extern int *a

    array VS pointer 参考: 1.Extern using pointer instead of array array is not pointer 2.extern array que ...

  6. 回溯算法之n皇后问题

    今天在看深度优先算法的时候,联想到DFS本质不就是一个递归回溯算法问题,只不过它是应用在图论上的.OK,写下这篇博文也是为了回顾一下回溯算法设计吧. 学习回溯算法问题,最为经典的问题我想应该就是八皇后 ...

  7. Java write And read Demo

    以下代码主要实现java中的读文件 和写入文件,练习一下流操作. 要点: 1.读取文件时,一定要加编码格式,否则中文乱码 import java.io.BufferedReader;import ja ...

  8. redis 常用操作命令

    操作相关的命令连接 quit:关闭连接(connection)auth:简单密码认证 持久化 save:将数据同步保存到磁盘bgsave:将数据异步保存到磁盘lastsave:返回上次成功将数据保存到 ...

  9. 图片裁切插件jCrop的使用心得(四)

    在本篇中我来介绍一下jcrop如何实时展现用户裁切的效果图以及在项目中使用该插件注意的问题. 首先,你们在创建头像时,都可以在旁边实时的看到我裁切后的效果图,就如博客园. 这个是如何实现的呢,其实并不 ...

  10. HTML5课程大纲/学习路线

    HTML5课程大纲/学习路线 这是什么? 这个一个HTML技术路线的课程大纲/学习大纲. 你能用它做什么? 如果你是找工作的人, 利用本大纲, 你可以学习HTML5语言, 做一个HTML前端工程师, ...