网上找了很多代码都是旧版协议的,研究了很久终于弄清楚了 现在发个用新版协议写的服务端代码出来(这个代码是从网上旧版协议改过来的)

最要就是握手协议和发送接受字符的方式变了

# 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版)相关推荐

  1. CAS 5.1.x 的搭建和使用(四)—— 配置使用HTTP协议访问的服务端

    CAS单点登录系列: CAS 5.1.x 的搭建和使用(一)-- 通过Overlay搭建服务端CAS 5.1.x 的搭建和使用(二)-- 通过Overlay搭建服务端-其它配置说明CAS 5.1.x ...

  2. 仿陌陌遇见社交聊天APP源码 网页聊天 LBS地址类社交APP 含Java服务端、PhP管理端等

    因原来创业团队解散,此产品对外整套系统出售源码. 第一,APP开发于2013年,相对创作思想,交互模式,UI模式已经落后了,故此才将APP有出售的想法. 第二,APP项目没有申请著作权,对各位后续开发 ...

  3. java websocket修改为同步_服务端向客户端推送消息技术之websocket的介绍

    websocket的介绍 在讲解WebSocket前,我们先来看看下面这种场景,在HTTP协议下,怎么实现. 需求: 在网站中,要实现简单的聊天,这种情况怎么实现呢?如下图: ​ 当发送私信的时候,如 ...

  4. python里使用协程和StreamReader、StreamWriter来创建echo服务端

    Python游戏开发入门 http://edu.csdn.net/course/detail/5690 在这个程序里,与前面使用asyncio.Protocol协议不一样,使用底层的StreamRea ...

  5. Docker搭建Nacos1.3+Seata1.4+MySQL8分布式事务(服务端)

    一.docker启动seata 拉取镜像 docker pull seataio/seata-server:latest 第一次启动seata,复制出其配置的相关文件 docker run --nam ...

  6. 使用WebSocket实现网页聊天室

    使用WebSocket实现网页聊天室 一.文章导读 服务器推送你还在使用轮询吗?本文将带你领略WebSocket的魅力,轻松实现服务器推送功能.本文将以下面两方面让你理解WebSocket并应用到具体 ...

  7. 如何使用WebSocket实现网页聊天室?

    一.文章导读 服务器推送你还在使用轮询吗?本文将带你领略WebSocket的魅力,轻松实现服务器推送功能.本文将以下面两方面让你理解WebSocket并应用到具体的开发中 WebSocket概述 使用 ...

  8. SpringBoot 使用WebSocket打造在线聊天室(基于注解)

    点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 精彩内容 java实战练习项目教程 2018微服务资源springboot.s ...

  9. 【项目设计】基于WebSocket的Web聊天室

    文章目录 1. 项目简介 2. 数据库表的设计 3. 实体类以及工具类的设计 3.1 实体类model 3.1.1 lombok的使用 3.2 工具类util 3.2.1 DBUtil 3.2.2 W ...

最新文章

  1. 卷积神经网络CNN——图像卷积与反卷积(后卷积,转置卷积)
  2. Codeforces#371 Div2
  3. mac下面安装mysql
  4. TypeScript里的.d.ts语法
  5. java泛型程序设计——反射和泛型
  6. php l方法,ThinkPHP的L方法使用简介
  7. php 检查数据库查询结果,php数据库连接、查询、显示结果的小例子
  8. 厂均 60W+ 的 秘密
  9. STM32CubeMX官网下载方法
  10. Java面试题超详细讲解系列之八【SQL优化篇】
  11. 计算机简单进制转换题目,计算机数制转换题!(1011011)2 =( )10=( )16 =( )8(110111101)2 =( )10=(...
  12. mobi格式电子书_中英文电子书下载网站大搜罗
  13. 浅谈木材加工企业的电气火灾隐患及电气火灾监控系统的应用
  14. matlab arma 仿真,基于Matlab的ARMA模型时间序列分析法仿真
  15. 腾达路由器设置成中继模式
  16. 数据分析之 假设检验
  17. C语言 将大写字母转换为小写字母
  18. 2012服务器系统下怎么分区,Windows Server 2012之更改系统分区
  19. 【菜菜子力扣刷题】1.两数之和
  20. 一.对于crc校验的流程演示说明。

热门文章

  1. javacurrentmap_Java ConcurrentHashMap.forEach方法代码示例
  2. Visual Studio Code(VScode)设置为中文界面
  3. Linux Shell脚本专栏_自动发布Java项目(tomcat)_10
  4. 开发经验分享_01_遇到问题三步走(思路+实战)
  5. linux环境下redis5.0的安装配置
  6. Centos7 Docker 目录挂载_入门试炼06
  7. 一文带你初识---虚拟dom
  8. 将活动工作表生成 PDF,并通过电子邮件发送
  9. 用java写ods系统_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0版)...
  10. 编写一个C程序,实现以下功能:动态申请长度为5的整数空间数组,用户输入5个整数;动态扩展数组空间为8,用户另外输入3个整数,最后输出扩展后的全部数组元素。