WebSocket+多线程python socket网页版实时在线聊天实现

  • Post author:
  • Post category:python


上一篇博文简单介绍了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 版权协议,转载请附上原文出处链接和本声明。