日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python与html5搭建聊天室_html5 websocket 新版协议聊天室 服务端(python版)

發布時間:2025/3/8 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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版)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。