网上测试了很多关于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>
效果图:

今天学习完工,应该是家庭,电影,小说的时间啦啦。。。
网上测试了很多关于PYTHON的WEBSOCKET样例,下面这个才成功了的更多相关文章
- [Python] SQLBuilder 演示样例代码
用Python写一个SQLBuilder.Java版能够从 http://www.java2s.com/Code/Java/Database-SQL-JDBC/SQLBuilder.htm 看到. 附 ...
- Python 100个样例代码【爆肝整理 建议收藏】
本教程包括 62 个基础样例,12 个核心样例,26 个习惯用法.如果觉得还不错,欢迎转发.留言. 一. Python 基础 62 例 1 十转二 将十进制转换为二进制: >>> b ...
- 用tornado实现一个简单的websocket样例
想用SPRING MVC,NODE.JS EXPRESS,TORNADO实现同一个功能,开阔一下视野. 先来TORNADO的吧.. 客户端代码都差不多,主要是服务端代码. TORNADO的说法: ht ...
- 老猿Python部分代码样例
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 PyQt编程实战:通过eventFilter监视QScrollArea的widget()的Paint ...
- 某互联网后台自动化组合测试框架RF+Sikuli+Python脚本
某互联网后台自动化组合测试框架RF+Sikuli+Python脚本 http://www.jianshu.com/p/b3e204c8651a 字数949 阅读323 评论1 喜欢0 一.**Robo ...
- 利用python对websocket进行并发压测
简述 产品经理鉴于运营反馈并对程序的websocket长连接保持怀疑的态度,让我对websocket服务器进行压力测试,我内心是拒绝的. 开发思路 查阅websocket的相关资料,查到python的 ...
- python实现websocket服务器,可以在web实时显示远程服务器日志
一.开始的话 使用python简单的实现websocket服务器,可以在浏览器上实时显示远程服务器的日志信息. 之前做了一个web版的发布系统,但没实现在线看日志,每次发布版本后,都需要登录到服务器上 ...
- python 实现websocket
python中websocket需要我们自己实现握手代码,流程是这样:服务端启动websocket服务,并监听.当客户端连接过来时,(需要我们自己实现)服务端就接收客户端的请求数据,拿到请求头,根据请 ...
- HTTPS请求HTTP接口被浏览器阻塞,python实现websocket客户端,websocket服务器,跨域问题,dwebsocket,https,拦截,服务端
HTTPS请求HTTP接口被浏览器阻塞,python实现websocket客户端,websocket服务器,跨域问题,dwebsocket,https,拦截,服务端 发表时间:2020-03-05 1 ...
随机推荐
- [问题] PHP接收Request payload传递过来的参数
在使用Apidoc的时候,有一个配置参数是 @apiSampleRequest http://localhost/api 在测试时,发现发送的参数是Request payload的,而PHP中使用的A ...
- 【转载】最近在用Arrays的asList()生成的List时,List元素的个数时而不正确,数组转化为List,即Arrays.asList(intArray);
最近在用Arrays的asList()生成的List时,List元素的个数时而不正确. Java代码 //经多次测试,只要传递的基本类型的数组,生成List的元素个数均为1 char arrc = { ...
- Ceph Newstore存储引擎介绍
在Ceph被越来越多地应用于各项存储业务过程中,其性能及调优策略也成为用户密切关注讨论的话题,影响性能表现关键因素之一即OSD存储引擎实现:Ceph基础组件RADOS是强一致.对象存储系统,其OSD底 ...
- scala学习笔记:理解类继承
scala> import scala.reflect._ import scala.reflect._ scala> class Person(@BeanProperty var nam ...
- Android系统中的dp和px的转换
android系统中DP和SP的转化:1.首先分析TypedValue.java 可以调用以下代码获得dp的值 TypedValue.applyDimension(TypedValue.COMPLEX ...
- Oracle查询慢, 特别是更新慢问题
近期, 客户发现查询比较慢, 特别是更新更慢. 原来是oracle listerner log太大导致. (C:\app\Administrator\diag\tnslsnr\ServerName\ ...
- How to: Reading an ini config file from a batch file
Original Link: http://almanachackers.com/blog/2009/12/31/reading-an-ini-config-file-from-a-batch-fil ...
- C++ 代码性能优化 -- 循环分割提高并行性
对于一个可结合和可交换的合并操作来说,比如整数的加法或乘法, 我们可以通过将一组合并操作分割成 2 个或更多的部分,并在最后合并结果来提高性能. 原理: 普通代码只能利用 CPU 的一个寄存器,分割后 ...
- 网络编程之UDP协议
UDP协议 UDP(User Datagram Protocol)也就是用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范. 提 ...
- 《APUE》第四章笔记(2)
下面介绍对stat结构的各个成员的操作函数. 先贴个stat结构的图: access函数: #include <unistd.h> int access(const char *pathn ...