用python实现的websocket代码_第1页
用python实现的websocket代码_第2页
用python实现的websocket代码_第3页
用python实现的websocket代码_第4页
用python实现的websocket代码_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

用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

print

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

print

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

print

('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':

print

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

#print

(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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论