python与html5搭建聊天室_html5 websocket 新版协议聊天室 服务端(python版)
网上找了很多代码都是旧版协议的,研究了很久终于弄清楚了 现在发个用新版协议写的服务端代码出来(这个代码是从网上旧版协议改过来的)
最要就是握手协议和发送接受字符的方式变了
# incoding=utf-8
import socket
import struct
import hashlib
import threading,random
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
connectionlist = {}
def sendMessage(message):
global connectionlist
for connection in connectionlist.values():
print connection
bstr = send_data(message)
print bstr
b = connection.send(bstr)
def deleteconnection(item):
global connectionlist
del connectionlist['connection'+item]
#接收客户端发送过来的消息,并且解包
def RecvData(nNum,client):
try:
pData = client.recv(nNum)
if not len(pData):
return False
except:
return False
else:
code_length = ord(pData[1]) & 127
if code_length == 126:
masks = pData[4:8]
data = pData[8:]
elif code_length == 127:
masks = pData[10:14]
data = pData[14:]
else:
masks = pData[2:6]
data = pData[6:]
raw_str = ""
i = 0
for d in data:
raw_str += chr(ord(d) ^ ord(masks[i%4]))
i += 1
return raw_str
#打包发送数据给客户端
def SendData(pData,client):
if(pData == False):
return False
else:
pData = str(pData)
token = "\x81"
length = len(pData)
if length < 126:
token += struct.pack("B", length)
elif length <= 0xFFFF:
token += struct.pack("!BH", 126, length)
else:
token += struct.pack("!BQ", 127, length)
pData = '%s%s' % (token,pData)
client.send(pData)
return True
def send_data(raw_str):
back_str = []
back_str.append('\x81')
data_length = len(raw_str)
if data_length < 125:
back_str.append(chr(data_length))
else:
back_str.append(chr(126))
back_str.append(chr(data_length >> 8))
back_str.append(chr(data_length & 0xFF))
back_str = "".join(back_str) + raw_str
return back_str
class WebSocket(threading.Thread):
def __init__(self,conn,index,name,remote, path="/"):
threading.Thread.__init__(self)
self.conn = conn
self.index = index
self.name = name
self.remote = remote
self.path = path
self.buffer = ""
def run(self):
print 'Socket%s Start!' % self.index
headers = {}
self.handshaken = False
while True:
if self.handshaken == False:
print 'Socket%s Start Handshaken with %s!' % (self.index,self.remote)
self.buffer += self.conn.recv(1024)
if self.buffer.find('\r\n\r\n') != -1:
header, data = self.buffer.split('\r\n\r\n', 1)
for line in header.split("\r\n")[1:]:
key, value = line.split(": ", 1)
headers[key] = value
print 'header:-->'+header
headers["Location"] = "ws://%s%s" %(headers["Host"], self.path)
self.buffer = data[8:]
key = headers["Sec-WebSocket-Key"]
token = self.generate_token(key)
handshake = '\
HTTP/1.1 101 Web Socket Protocol Handshake\r\n\
Upgrade: webSocket\r\n\
Connection: Upgrade\r\n\
Sec-WebSocket-Accept:%s\r\n\
Sec-WebSocket-Origin: %s\r\n\
Sec-WebSocket-Location: %s\r\n\r\n\
' %(token,headers['Origin'], headers['Location'])
print handshake
num = self.conn.send(handshake)
print str(num)
self.handshaken = True
print 'Socket%s Handshaken with %s success!' % (self.index,self.remote)
#self.conn.send('\x00'+'Welcome'+'\xFF'+'\n')
bstr = send_data("Welcome")
print bstr
self.conn.send(bstr)
#SendData('\x00'+'Welcome'+'\xFF',self.conn)
#sendMessage('Welcome, '+self.name+' !')
else:
self.buffer = RecvData(8196,self.conn)
if self.buffer:
print 'rec:'+self.buffer
if self.buffer:
#s = self.buffer.split("\xFF")[0][1:]
s = self.buffer
if s=='quit':
print 'Socket%s Logout!' % (self.index)
sendMessage(self.name+' Logout')
deleteconnection(str(self.index))
self.conn.close()
break
else:
print 'Socket%s Got msg:%s from %s!' % (self.index,s,self.remote)
sendMessage(self.name+':'+s)
self.buffer = ""
def generate_token(self, key):
import base64
nkey=key+'258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
nkey=base64.b64encode(hashlib.sha1(nkey).digest())
return nkey
class WebSocketServer(object):
def __init__(self):
self.socket = None
def begin(self):
print 'WebSocketServer Start!'
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.bind(("192.168.1.210",1234))
self.socket.listen(50)
global connectionlist
i=0
while True:
connection, address = self.socket.accept()
username=address[0]
newSocket = WebSocket(connection,i,username,address)
newSocket.start()
connectionlist['connection'+str(i)]=connection
i = i + 1
if __name__ == "__main__":
server = WebSocketServer()
server.begin()
python与html5搭建聊天室_html5 websocket 新版协议聊天室 服务端(python版)相关推荐
- CAS 5.1.x 的搭建和使用(四)—— 配置使用HTTP协议访问的服务端
CAS单点登录系列: CAS 5.1.x 的搭建和使用(一)-- 通过Overlay搭建服务端CAS 5.1.x 的搭建和使用(二)-- 通过Overlay搭建服务端-其它配置说明CAS 5.1.x ...
- 仿陌陌遇见社交聊天APP源码 网页聊天 LBS地址类社交APP 含Java服务端、PhP管理端等
因原来创业团队解散,此产品对外整套系统出售源码. 第一,APP开发于2013年,相对创作思想,交互模式,UI模式已经落后了,故此才将APP有出售的想法. 第二,APP项目没有申请著作权,对各位后续开发 ...
- java websocket修改为同步_服务端向客户端推送消息技术之websocket的介绍
websocket的介绍 在讲解WebSocket前,我们先来看看下面这种场景,在HTTP协议下,怎么实现. 需求: 在网站中,要实现简单的聊天,这种情况怎么实现呢?如下图: 当发送私信的时候,如 ...
- python里使用协程和StreamReader、StreamWriter来创建echo服务端
Python游戏开发入门 http://edu.csdn.net/course/detail/5690 在这个程序里,与前面使用asyncio.Protocol协议不一样,使用底层的StreamRea ...
- Docker搭建Nacos1.3+Seata1.4+MySQL8分布式事务(服务端)
一.docker启动seata 拉取镜像 docker pull seataio/seata-server:latest 第一次启动seata,复制出其配置的相关文件 docker run --nam ...
- 使用WebSocket实现网页聊天室
使用WebSocket实现网页聊天室 一.文章导读 服务器推送你还在使用轮询吗?本文将带你领略WebSocket的魅力,轻松实现服务器推送功能.本文将以下面两方面让你理解WebSocket并应用到具体 ...
- 如何使用WebSocket实现网页聊天室?
一.文章导读 服务器推送你还在使用轮询吗?本文将带你领略WebSocket的魅力,轻松实现服务器推送功能.本文将以下面两方面让你理解WebSocket并应用到具体的开发中 WebSocket概述 使用 ...
- SpringBoot 使用WebSocket打造在线聊天室(基于注解)
点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 精彩内容 java实战练习项目教程 2018微服务资源springboot.s ...
- 【项目设计】基于WebSocket的Web聊天室
文章目录 1. 项目简介 2. 数据库表的设计 3. 实体类以及工具类的设计 3.1 实体类model 3.1.1 lombok的使用 3.2 工具类util 3.2.1 DBUtil 3.2.2 W ...
最新文章
- 卷积神经网络CNN——图像卷积与反卷积(后卷积,转置卷积)
- Codeforces#371 Div2
- mac下面安装mysql
- TypeScript里的.d.ts语法
- java泛型程序设计——反射和泛型
- php l方法,ThinkPHP的L方法使用简介
- php 检查数据库查询结果,php数据库连接、查询、显示结果的小例子
- 厂均 60W+ 的 秘密
- STM32CubeMX官网下载方法
- Java面试题超详细讲解系列之八【SQL优化篇】
- 计算机简单进制转换题目,计算机数制转换题!(1011011)2 =( )10=( )16 =( )8(110111101)2 =( )10=(...
- mobi格式电子书_中英文电子书下载网站大搜罗
- 浅谈木材加工企业的电气火灾隐患及电气火灾监控系统的应用
- matlab arma 仿真,基于Matlab的ARMA模型时间序列分析法仿真
- 腾达路由器设置成中继模式
- 数据分析之 假设检验
- C语言 将大写字母转换为小写字母
- 2012服务器系统下怎么分区,Windows Server 2012之更改系统分区
- 【菜菜子力扣刷题】1.两数之和
- 一.对于crc校验的流程演示说明。
热门文章
- javacurrentmap_Java ConcurrentHashMap.forEach方法代码示例
- Visual Studio Code(VScode)设置为中文界面
- Linux Shell脚本专栏_自动发布Java项目(tomcat)_10
- 开发经验分享_01_遇到问题三步走(思路+实战)
- linux环境下redis5.0的安装配置
- Centos7 Docker 目录挂载_入门试炼06
- 一文带你初识---虚拟dom
- 将活动工作表生成 PDF,并通过电子邮件发送
- 用java写ods系统_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0版)...
- 编写一个C程序,实现以下功能:动态申请长度为5的整数空间数组,用户输入5个整数;动态扩展数组空间为8,用户另外输入3个整数,最后输出扩展后的全部数组元素。