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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql数据库开发笔记_MySQL数据库生成数据库说明文档

在半年多前为一个MySQL数据库生成过数据库说明文档&#xff0c;今天要重新生成一份&#xff0c;但是发现完全不记得当时是怎么生成的&#xff0c;只能在网上搜索重来一遍&#xff0c;所以今天特意把这个过程记录一下。一、安装使用MySQL数据库表结构导出器DBExportDoc V1.0 For…

java 字符串缓冲区_详解Java中字符串缓冲区StringBuffer类的使用

StringBuffer 是一个线程安全的可变的字符序列。它继承于AbstractStringBuilder&#xff0c;实现了CharSequence接口。StringBuilder 也是继承于AbstractStringBuilder的子类&#xff1b;但是&#xff0c;StringBuilder和StringBuffer不同&#xff0c;前者是非线程安全的&#…

rabbitmq java文档_RabbitMQ文档翻译——Hello World!(上)

文章主要翻译自RabbitMQ官方文档&#xff0c;主要是为了练习英语翻译&#xff0c;顺便学习一下RabbitMQ&#x1f636;其中也记录了一些爬过的坑IntroductionRabbitMQ is a message broker. The principal idea is pretty simple: it accepts and forwards messages. You can th…

java string 包含http_Java中使用HttpPost上传文件以及HttpGet进行API请求(包含HttpPost上传文件)...

一、HttpPost上传文件public static String getSuffix(final MultipartFile file){if(file null || file.getSize() 0){return null;}String fileName file.getOriginalFilename();return fileName.substring(fileName.lastIndexOf(".")1);}public static JSONObj…

java倒计时跳出窗口_java倒计时弹出框

直接使用java语言写出一个运行时的弹出框倒计时&#xff1a;package test.dagong.testDecreaseDate;import java.awt.Container;import java.awt.FlowLayout;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.sw…

jpa mysql存储过程_Jpa调用存储过程及参数

public List findAllEntityListBySearch(Long inputInfoId, int flag) throws Exception {List infoviewListnew ArrayList<>();EntityManager em emf.createEntityManager();try {StoredProcedureQuery storedProcedure em.createStoredProcedureQuery("存储名称&…

python从mongodb里取出数据进行可视化_python3 mongoDB数据库的安装配置与可视化

python3 mongoDB数据库的安装配置与可视化。前天说是要学习如何使用mongoDB的链接与安装。安装环境&#xff1a; wind10 还是盗版的 磁盘分析&#xff1a;只有一个C盘&#xff0c;步骤&#xff1a;1 . 下载这里下载了对应的msi文件&#xff0c;貌似.zip文件没有了2 我默认把mon…

idea 注入mapper报错报红的几种解决方案

文章目录 前言方法1&#xff1a;为 Autowired 注解设置required false方法2&#xff1a;用 Resource 替换 Autowired方法3&#xff1a;在Mapper接口上加上Repository注解方法4&#xff1a;用Lombok方法5&#xff1a;把IDEA的警告关闭掉方法6&#xff1a;不用管他 前言 相信大…

java 调用对象的方法_JAVA调用对象方法的执行过程

JAVA调用对象方法的执行过程&#xff1a;①.编译器查看对象的声明类型和方法名。假设调用x.f(parameter), 且隐式参数x声明为C类型的对象&#xff0c;有可能在C对象中存在多个参数类型和参数个数不同的f的方法{例如&#xff1a;f(int)、f(int,String)和f(String)}&#xff0c;…

java类默认权限_Java 访问权限控制以及类初始化顺序

一. Package在一个项目中&#xff0c;不可以有相同的两个包名package语句必须是文件中除注释外第一句程序代码&#xff0c;否则不能通过编译。二. Java访问权限概述类成员&#xff1a;对于一个类&#xff0c;其成员(包括成员变量和成员方法)能否被其他类所访问&#xff0c;取决…

java http头 字符串转日期_springboot~DTO字符字段与日期字段的转换问题

不会自动转换string与date主要是这个意思&#xff0c;前端提交的JSON里&#xff0c;日期是一个字符串&#xff0c;而对应后端的实体里&#xff0c;它是一个Date的日期&#xff0c;这两个在默认情况下是不能自动转换的&#xff0c;我们先看一下实体实体public class UserDTO {pr…

java super extends_Java继承和super的用法

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼继承的关键字:extends格式如下: class 子类名 extends父类名{...}例如学生是继承人类这一父类的.class student extends person{...}如果一个类的声明没有使用关键字extends,则这个类默认是继承Object类的.Object是所有类的父类.Ob…

比较abc大小的java_比较abc大小java

比较abc大小java[2021-02-09 04:04:20] 简介:php去除nbsp的方法&#xff1a;首先创建一个PHP代码示例文件&#xff1b;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐&#xff1a;《PH…

海天食品的java开发工作如何_再三个月就秋招了,我想找一份java开发工作,现在应该怎么准备一下?...

在找工作之前&#xff0c;大家都要做一些准备工作&#xff0c;java开发也是如此掌握核心JavaSE首先&#xff0c;从核心Java(JavaSE)开始学习&#xff0c;尽可能地掌握它。你应该了解和掌握一些基本概念&#xff0c;如循环&#xff0c;数组&#xff0c;运算符等等。此外&#xf…

java udp简单聊天程序_Java基于UDP协议实现简单的聊天室程序

最近比较闲&#xff0c;一直在抽空回顾一些java方面的技术应用。今天没什么事做&#xff0c;基于udp协议&#xff0c;写了一个非常简单的聊天室程序。现在的工作&#xff0c;很少用到socket&#xff0c;也算是对java网络编程方面的一个简单回忆。先看一下效果&#xff1a;实现的…

java9 反应编程_Java9第四篇-Reactive Stream API响应式编程

file我计划在后续的一段时间内&#xff0c;写一系列关于java 9的文章&#xff0c;虽然java 9 不像Java 8或者Java 11那样的核心java版本&#xff0c;但是还是有很多的特性值得关注。期待您能关注我&#xff0c;我将把java 9 写成一系列的文章&#xff0c;大概十篇左右。Java 9的…

bb10系统支持java吗_黑莓BB10怎么样 BlackBerry 10系统好用吗?

曾几何时黑莓Blackberry OS是一款十分受用户欢迎的手机系统&#xff0c;不过随着手机系统市场已经被苹果iOS、谷歌安卓、微软Windows Phone三分天下&#xff0c;致使曾经的黑莓帝国逐渐沦陷&#xff0c;体验和性能都已经明显跟不上iOS与安卓等系统的脚步了&#xff0c;也因为如…

java中兴参与实参相同_中兴通讯_传输SDH试题(含答案)

中兴传输SDH试题一、单项选择题(每小题2分&#xff0c;共30分)1、在SDH系统中, RSOH指(A)。A.再生段开销B.复用段开销C.再生段通道开销D.复用段通道开销2.、同步数字体系SDH具有(A)帧结构。A.块状B.串行C.链形D.三维3、管理指针单元的作用是(A)。A、用来指示信息净负荷的第一个…

php 正则提取url,php 正则表达式提取网页超级链接url的函数

function match_links($document) {preg_match_all("]))[^>]*>?(.*?)isx",$document,$links);while(list($key,$val) each($links[2])) {if(!empty($val))$match[link][] $val;}while(list($key,$val) each($links[3])) {if(!empty($val))$match[link][] …

php array colum,php5.5新数组函数array_column使用

array_column 用于获取二维数组中的元素(PHP 5 > 5.5.0)&#xff0c;但我们有时候需要在低版本中使用&#xff0c;那么就可以使用下面的代码即可PHP5.5发布了&#xff0c;其中增加了一个新的数组函数array_column&#xff0c;感觉不错的&#xff01;但是低版本PHP要使用&…