## websocket.py
import socket
import struct
import hashlib,base64
import threading,random
#线程,套接字,哈希表,随机数
#存放链接客户fd,元组
connectionlist = {}
#发送指定的消息
def sendMessage(message):
#对全局变量的引用
global connectionlist
#向客户端集合中每个成员发送消息
# %:字符串合成
# ,:字符串叠加
for connection in connectionlist.values():
connection.send("\x00%s\xFF" % message)
#删除连接,从集合中删除连接对象item(建立一个连接追加到连接中)
def deleteconnection(item):
global connectionlist
del connectionlist['connection'+item]
#定义WebSocket对象(基于线程对象)
class WebSocket(threading.Thread):
#
def __init__(self,conn,index,name,remote, path="/"):
#初始化线程
threading.Thread.__init__(self)
#初始化数据,全部存储到自己的数据结构中self
self.conn = conn
self.index = index
self.name = name
self.remote = remote
self.path = path
self.buffer = ""
#运行线程
def run(self):
#Log输出,套接字index启动
print 'Socket%s Start!' % self.index
headers = {}
#Socket是否握手的标志,初始化为false.
self.handshaken = False
#循环执行如下逻辑
while True:
#如果没有进行握手
if self.handshaken == False:
#Log输出,Socket x开始与远程客户y进行握手过程
print 'Socket%s Start Handshaken with %s!' % (self.index,self.remote)
#从客户端接受1kb数据,存放到buffer中
self.buffer += self.conn.recv(1024)
#如果接受数据中有\r\n\r\n的标志
if self.buffer.find('\r\n\r\n') != -1:
#按照这种标志分割一次,结果为:header data(网页的解析)
#再对header 和 data部分进行单独的解析
header, data = self.buffer.split('\r\n\r\n', 1)
#对header进行分割后,取出后面的n-1个部分
for line in header.split("\r\n")[1:]:
#逐