文档章节

websocket

素人派
 素人派
发布于 2015/07/22 07:56
字数 586
阅读 162
收藏 0
  • 介绍
websocket可是使javascript来连接一个socket,这样的话,可以建立一个长连接,实现“推送”效果。 本文中介绍了如何用Python来实现websocket的服务端,以及使用javascript来作为客户端与之通信,包括了消息的发送和接收。
  • 原理
js发送的协议内容: [codesyntax lang="div"]
GET / HTTP/1.1
Host: 10.0.32.39:9000
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://localhost
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Cookie: csrftoken=jk1AqWVZNJrRp0nI1lLNLNdChAnWGnZq
Sec-WebSocket-Key: 43FqzAWksH8aPcp2Kko4oA==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
[/codesyntax] 服务器响应的数据包格式: [codesyntax lang="div"]
HTTP/1.1 101 Switching Protocols
Upgrade:websocket
Connection: Upgrade
Sec-WebSocket-Accept: CVx5sEUL61AJLhMneOxyXHEe8ok=
WebSocket-Location: ws://0.0.0.0:9000/chat
WebSocket-Protocol:chat
[/codesyntax]
  • javascript客户端
[codesyntax lang="javascript"]
<html> <head>
<script type="text/javascript">
var socket = new WebSocket('ws://10.0.32.39:9000');
socket.onopen = function(e)
{
	console.log('onopen : ' + e);
}

socket.onclose = function(e)
{
	console.log('onclose : ' + e + '; length : ' + arguments.length);
}

socket.onmessage = function(e)
{
	console.log('onmessage : ' + e + '; length : ' + arguments.length);
	console.log('data : ' + e.data);
	socket.send('suren');
}
</script>
</head> <body> </body> </html>
[/codesyntax]
  • Python编写的服务端
模块安装: pip install simplejson pip install base64 pip install hashlib 下面是websocket的服务器的实现代码: [codesyntax lang="python"]
__author__ = 'suren'

import simplejson
import socket
import sys
import base64
import hashlib
import time

HOST = '10.0.32.39'
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, 5, 'suren'))
	msg = conn.recv(1024)
	msg = parse_data(msg)
	print('msg : ' + msg)

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

	time.sleep(1)
	conn.send('%c%c%s' % (0x81, 5, 'suren'))
	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)
[/codesyntax]
  • 参考
http://www.jb51.net/article/51516.htm Python之socket The WebSocket Protocol http://datatracker.ietf.org/doc/rfc6455/?include_text=1 在安卓中使用websocket http://my.oschina.net/1123581321/blog/333031

本文转载自:http://surenpi.com/2015/04/10/websocket/

上一篇: 树莓派连接红外
下一篇: Tomcat原理分析
素人派
粉丝 26
博文 1907
码字总数 10223
作品 6
东城
程序员
私信 提问
八问WebSocket协议:为你快速解答WebSocket热门疑问

本文由“小姐姐养的狗”原创发布于“小姐姐味道”公众号,原题《WebSocket协议 8 问》,收录时有优化和改动。感谢原作者的分享。 一、引言 WebSocket是一种比较新的协议,它是伴随着html5规范...

JackJiang2011
04/25
0
0
websocket:handlers 不起作用

@jack_jones 你好,想跟你请教个问题: 我在使用Spring websocket 时遇到了websocket:handlers不起作用, 其中Spring版本为4.1.6.RELEASE...

TreasureWe
2016/02/26
1K
2
【译】 WebSocket 协议第十二章——使用其他规范中的WebSocket协议

概述 本文为 WebSocket 协议的第十二章,本文翻译的主要内容为如何使用其他规范中的 WebSocket 协议。 有兴趣了解该文档之前几章内容的同学可以见: 【译】WebSocket 协议——摘要( Abstra...

黄Java
02/19
0
0
实时通信技术之websocket

本文章即从4个方面带大家了解websocket: websocket是什么? 为什么需要 WebSocket ? websocket的优点与缺点? websocket的相关使用(客户端与服务器端)? websocket的相关协议与规范? 一...

一看就喷亏的小猿
2018/11/03
545
2
Spray.io搭建Rest — 支持WebSocket

Spray.io尝试 使用Spray.io搭建Rest服务 Spray.io搭建Rest — 支持Twirl模板并部署 Spray.io搭建Rest — 支持WebSocket Spray.io搭建Rest — 支持WebSocket 工程地址:http://git.oschina.ne...

ForEleven
2014/04/30
1K
3

没有更多内容

加载失败,请刷新页面

加载更多

spring源码分析6: ApplicationContext的初始化与BeanDefinition的搜集入库

先前几篇都是概念的讲解:回顾下 BeanDefinition 是物料 Bean是成品 BeanFactory是仓库,存储物料与成品 ApplicationContext初始化搜集物料入库,触发生产线,取出物料生产Bean 本文研究spr...

星星之焱
26分钟前
5
0
彻底解决tomcat乱码问题

本地项目请求访问,浏览器中文输出没问题。 部署到服务器上面之后,返回到浏览器的中文就乱码了。 尝试办法: 1.修改tomcat下的conf中的service.xml中的配置信息: 重新启动后,没有效果还是...

诗书易经
42分钟前
5
0
Java开发需要掌握的IDEA插件大全

1、Lombok 解释:这是最基本的插件,2017年就火了,还没用的百度一下吧。 博客链接:Intellij IDEA 安装lombok及使用详解 2、PlantUML integration 解释:各种类之间的关联图,高级开发必备。...

木九天
42分钟前
6
0
python学习10.05:Python range()快速初始化数字列表

实际场景中,经常需要存储一组数字。例如在游戏中,需要跟踪每个角色的位置,还可能需要跟踪玩家的几个最高得分。在数据可视化中,处理的几乎都是由数字(如温度、距离、人口数量、经度和纬度...

太空堡垒185
49分钟前
4
0
java单元测试,PowerMockito模拟方法内new对象

在做单元测试中有时候需要对方法内new出来的对象进行隔离,这是我们需要使用PowerMockito。 添加依赖 <dependency> <groupId>org.powermock</groupId> <artifactId>......

如梦之猿
51分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部