python版本的websocket服务

python写的简单websocket服务例子:

# coding=utf-8

import socket
import threading
import struct
import sys
import base64
import hashlib


def InitWebSocketServer():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        sock.bind(("localhost", 3398))
        sock.listen(100)
    except:
        print "Server is already running,quit"
        sys.exit()
    while True:
        connection, address = sock.accept()
        print connection, address[0]
        if handshake(connection) != False:
            t = threading.Thread(target=DoRemoteCommand, args=(connection,))
            t.start()


def handshake(client):
    headers = {}
    shake = client.recv(1024)
    print shake
    if not len(shake):
        return False

    header, data = shake.split('\r\n\r\n', 1)
    for line in header.split("\r\n")[1:]:
        key, value = line.split(": ", 1)
        headers[key] = value

    if headers.has_key("Sec-WebSocket-Key") == False:
        print "this socket is not websocket,close"
        client.close()
        return False
    szOrigin = headers.get("Origin") or 'none'
    szKey = base64.b64encode(
        hashlib.sha1(headers["Sec-WebSocket-Key"] + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11').digest())
    szHost = headers["Host"]

    our_handshake = "HTTP/1.1 101 Switching Protocols\r\n"                     "Upgrade:websocket\r\n"                    "Connection: Upgrade\r\n"                    "Sec-WebSocket-Accept:" + szKey + "\r\n"                     "WebSocket-Origin:" + szOrigin + "\r\n"                     "WebSocket-Location: ws://" + szHost + "/WebManagerSocket\r\n"                     "WebSocket-Protocol:WebManagerSocket\r\n\r\n"

    client.send(our_handshake)
    return True


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 DoRemoteCommand(connection):
    while 1:
        connection.send('success')
        szBuf = RecvData(8196, connection)
        if szBuf == False:
            break
        else:
            SendData(szBuf, connection)


if __name__ == "__main__":
    InitWebSocketServer()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值