




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
用python实现的websocket代码ubuntu下python2.76windows
\o"Python知识库"Python
2.79,chrome37firefox35通过代码是在别人(cddn有人提问)基础上改的,主要改动了parsedata和sendmessage这2个函数.改代码参考下面了这段文档.主要是第5条,发送的数据长度分别是8bit和16bit和64bit(即
127,65535,和2^64-1)三种情况
发送和收取是一样的,例如1.长度小于125时(由于使用126,127用作标志位.)2.数据长度在128-65525之间时,
PayloadLength位设为126,后面额外使用16bit表示长度(前面的126不再是长度的一部分)3.数据长度在65526-2^64-1之间时,
PayloadLength位设为127,后面额外使用64bit表示长度(前面的127不再是长度的一部分)Fin(bit0):determinesifthisisthelastframeinthemessage.Thiswouldbesetto1ontheendofaseriesofframes,orinasingle-framemessage,itwouldbesetto1asitisboththefirstandlastframe.RSV1,RSV2,RSV3(bits1-3):thesethreebitsarereservedforwebsocketextensions,andshouldbe0unlessaspecificextensionrequirestheuseofanyofthesebytes.Opcode(bits4-7):thesefourbitsdeteriminethetypeoftheframe.ControlframescommunicateWebSocketstate,whilenon-controlframescommunicatedata.Thevarioustypesofcodesinclude:x0:continuationframe;thisframecontainsdatathatshouldbeappendedtothepreviousframex1:textframe;thisframe(andanyfollowing)containstextx2:binaryframe;thisframe(andanyfollowing)containsbinarydatax3-x7:non-controlreservedframes;thesearereservedforpossiblewebsocketextensionsx8:closeframe;thisframeshouldendtheconnectionx9:pingframexA:pongframexB-xF:controlreservedframesMask(bit8):thisbitdetermineswhetherthisspecificframeusesamaskornot.PayloadLength(bits9-15,or16-31,or16-79):thesesevenbytesdeterminethepayloadlength.Ifthelengthis126,thelengthisactuallydeterminedbybits16through31(thatis,thefollowingtwobytes).Ifthelengthis127,thelengthisactuallydeterminedbybits16through79(thatis,thefollowingeightbytes).MaskingKey(thefollowingfourbytes):thisrepresentsthemask,iftheMaskbitissetto1.PayloadData(thefollowingdata):finally,thedata.Thepayloaddatamaybesentovermultipleframes;weknowthesizeoftheentiremessagebythepayloadlengththatwassent,andcanappenddatatogethertoformasinglemessageuntilwereceivethemessagewiththeFinflag.Eachconsecutivepayload,ifitexists,willcontainthe0“continuationframe”opcode.服务端代码:#coding=utf8
#!/usr/bin/python
import
struct,socket
import
hashlib
import
threading,random
import
time
import
struct
from
base64
import
b64encode,
b64decode
connectionlist
=
{}
g_code_length
=
0
g_header_length
=
0
def
hex2dec(string_num):
return
str(int(string_num.upper(),
16))
def
get_datalength(msg):
global
g_code_length
global
g_header_length
(len(msg))
g_code_length
=
ord(msg[1])
&
127
received_length
=
0;
if
g_code_length
==
126:
#g_code_length
=
msg[2:4]
#g_code_length
=
(ord(msg[2])<<8)
+
(ord(msg[3]))
g_code_length
=
struct.unpack('>H',
str(msg[2:4]))[0]
g_header_length
=
8
elif
g_code_length
==
127:
#g_code_length
=
msg[2:10]
g_code_length
=
struct.unpack('>Q',
str(msg[2:10]))[0]
g_header_length
=
14
else:
g_header_length
=
6
g_code_length
=
int(g_code_length)
return
g_code_length
self.buffer_utf8
=
""
self.length_buffer
=
0
def
run(self):#重载Thread的run
print('Socket%s
Start!'
%
self.index)
headers
=
{}
self.handshaken
=
False
while
True:
if
self.handshaken
==
False:
('Socket%s
Start
Handshaken
with
%s!'
%
(self.index,self.remote))
self.buffer
+=
bytes.decode(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
headers["Location"]
=
("ws://%s%s"
%(headers["Host"],
self.path))
key
=
headers['Sec-WebSocket-Key']
token
=
b64encode(hashlib.sha1(str.encode(str(key
+
self.GUID))).digest())
handshake="HTTP/1.1
101
Switching
Protocols\r\n"\
"Upgrade:
websocket\r\n"\
"Connection:
Upgrade\r\n"\
"Sec-WebSocket-Accept:
"+bytes.decode(token)+"\r\n"\
"WebSocket-Origin:
"+str(headers["Origin"])+"\r\n"\
"WebSocket-Location:
"+str(headers["Location"])+"\r\n\r\n"
self.conn.send(str.encode(str(handshake)))
self.handshaken
=
True
('Socket
%s
Handshaken
with
%s
success!'
%(self.index,
self.remote))
sendMessage(u'Welcome,
'
+
+
'
!')
self.buffer_utf8
=
""
g_code_length
=
0
else:
global
g_code_length
global
g_header_length
mm=self.conn.recv(128)
if
len(mm)
<=
0:
continue
if
g_code_length
==
0:
get_datalength(mm)
#接受的长度
self.length_buffer
=
self.length_buffer
+
len(mm)
self.buffer
=
self.buffer
+
mm
if
self.length_buffer
-
g_header_length
<
g_code_length
:
continue
else
:
self.buffer_utf8
=
parse_data(self.buffer)
#utf8
msg_unicode
=
str(self.buffer_utf8).decode('utf-8',
'ignore')
#unicode
if
msg_unicode=='quit':
(u'Socket%s
Logout!'
%
(self.index))
nowTime
=
time.strftime('%H:%M:%S',time.localtime(time.time()))
sendMessage(u'%s
%s
say:
%s'
%
(nowTime,
self.remote,
+'
Logout'))
deleteconnection(str(self.index))
self.conn.close()
break
#退出线程
else:
(u'Socket%s
Got
msg:%s
from
%s!'
%
(self.index,
msg_unicode,
self.remote))
nowTime
=
time.strftime(u'%H:%M:%S',time.localtime(time.time()))
sendMessage(u'%s
%s
say:
%s'
%
(nowTime,
self.remote,
msg_unicode))
#重置buffer和bufferlength
self.buffer_utf8
=
""
self.buffer
=
""
g_code_length
=
0
self.length_buffer
=
0
self.buffer
=
""
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.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
self.socket.bind(("",12345))
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()
#开始线程,执行run函数
connectionlist['connection'+str(i)]=connection
i
=
i
+
1
if
__name__
==
"__main__":
server
=
WebSocketServer()
server.begin()
客户端代码:<!DOCTYPE
html>
<html>
<head>
<title>WebSocket</title>
<style>
html,
body
{
font:
normal
0.9em
arial,
helvetica;
}
#log
{
width:
440px;
height:
200px;
border:
1px
solid
#7F9DB9;
overflow:
auto;
}
#msg
{
width:
330px;
}
</style>
<script>
var
socket;
function
init()
{
var
host
=
"ws://:12345/";
try
{
socket
=
new
WebSocket(host);
socket.onopen
=
function
(msg)
{
log('Connected');
};
socket.onmessage
=
function
(msg)
{
log(msg.data);
};
socket.onclose
=
function
(msg)
{
log("Lose
Connection!");
};
}
catch
(ex)
{
log(ex);
}
$("msg").focus();
}
function
send()
{
var
txt,
msg;
txt
=
$("msg");
msg
=
txt.value;
if
(!msg)
{
alert("Message
can
not
be
empty");
return;
}
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 现代仓储的管理技术试题及答案
- 《安全工程师》安新县2024年全真模拟试题含解析
- 供热用户知识培训课件
- 物流行业中的职业发展规划及试题及答案
- 2024年供应链数字化转型试题及答案
- 云南省曲靖市重点中学2025年高考化学四模试卷含解析
- 2024年CPSM考试知识体系图解及试题及答案
- 高效备考CPSM考试试题及答案
- 2024年CPMM重要知识点试题及答案
- 生物药物的开发流程试题及答案
- 人教版 数学一年级下册 第三单元 100以内数的认识综合素养评价(含答案)
- 河南省郑州市东区2024-2025学年九年级下学期第一次数学试题试卷(卷后带解析)
- 2025年公共卫生相关试题及答案
- 2025年陕西省咸阳市秦都区启迪中学九年级中考一模数学试题(原卷版+解析版)
- 嘉德委托拍卖合同范本
- 2025年合肥经济技术职业学院单招职业技能测试题库含答案
- 2025年河南应用技术职业学院单招职业技能测试题库新版
- 实验室试剂及仪器采购合同书
- 2025年上半年黑龙江鹤岗市兴山区招聘事业单位人员5人重点基础提升(共500题)附带答案详解-1
- 区域临床检验中心
- 上海市2024年中考英语试题及答案
评论
0/150
提交评论