上一篇博文简单介绍了websocket通信协议,本文将应用websocket以及Python多线程网络编程实现一个简单的网页版实时在线聊天小系统,先来张图轻松一下
本应用开发环境
windows7 x86_64
JetBrains PyCharm Community Edition 2017.2.2 x64
python3.5
Google Chrome浏览器
测试运行环境
server端运行在windows PyCharm中
client端运行在rhel7.2 Apache服务中
开发语言涉及
Python、JavaScript(以及jQuery库)、HTML、CSS
应用核心实现
Python套接字、Python多线程、websocket通信协议应用、前端三剑客
功能实现
用户自注册、登录、搜索并添加好友、加入群聊、创建群组、点对点聊天、群组聊天、退出等
服务端实现
# coding=utf-8
'''
file:websockt-server.py
date:2017/10/2 20:48
author:lockey
email:lockey@123.com
desc:
'''
import socket,json
import hashlib
import threading
from base64 import b64encode
#用户信息存储字典
users={}
#群组信息存储字典
groups={}
#判断是否设置了掩码
def is_bit_set(int_type, offset):
mask = 1 << offset
return not 0 == (int_type & mask)
#设置掩码
def set_bit(int_type, offset):
return int_type | (1 << offset)
def bytes_to_int(data):
# note big-endian is the standard network byte order
return int.from_bytes(data, byteorder='big')
#发送数据的封装,不完整实现
def pack(data):
"""pack bytes for sending to client"""
frame_head = bytearray(2)
# set final fragment
frame_head[0] = set_bit(frame_head[0], 7)
# set opcode 1 = text
frame_head[0] = set_bit(frame_head[0], 0)
# payload length
assert len(data) < 126, "haven't implemented that yet"
frame_head[1] = len(data)
# add data
frame = frame_head + data.encode('utf-8')
return frame
#接收数据的转换
def parse_recv_data(msg):
en_bytes = b''
cn_bytes = []
if len(msg) < 6:
return ''
v = 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:]
for k, v in enumerate(data):
nv = chr(v ^ mask[k % 4])
nv_bytes = nv.encode()
nv_len = len(nv_bytes)
if nv_len == 1:
en_bytes += nv_bytes
else:
en_bytes += b'%s'
cn_bytes.append(ord(nv_bytes.decode()))
if len(cn_bytes) > 2:
# 字节数组转汉字
cn_str = ''
clen = len(cn_bytes)
count = int(clen / 3)
for x in range(0, count):
i = x * 3
b = bytes([cn_bytes[i], cn_bytes[i + 1], cn_bytes[i + 2]])
cn_str += b.decode()
new = en_bytes.replace(b'%s%s%s', b'%s')
new = new.decode()
res = (new % tuple(list(cn_str)))
else:
res = en_bytes.decode()
return res
#发送数据
def send_data(dataObj):
data = json.dumps(dataObj)#转换数据为对象判断数据发送类型(群发或者点对点)
if data == None or<
版权声明:本文为Lockey23原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。