python websocket

feixuyue 2015-02-11 10:54:58
最近在学习python 及html5,在网上找了些代码,但遇到了问题,调试不过。
页面
<!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://127.0.0.1:1234/";
try {
socket = new WebSocket(host);
socket.onopen = function (msg) {
;
};
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;
}
txt.value = "";
txt.focus();
try {
socket.send(msg);
} catch (ex) {
log(ex);
}
}

window.onbeforeunload = function () {
try {
socket.send('quit');
socket.close();
socket = null;
}
catch (ex) {
log(ex);
}
};


function $(id) {
return document.getElementById(id);
}
function log(msg) {
$("log").innerHTML += "<br>" + msg;
}
function onkey(event) {
if (event.keyCode == 13) {
send();
}
}
</script>

</head>


<body onload="init()">
<h3>WebSocket</h3>
<br><br>

<div id="log"></div>
<input id="msg" type="textbox" onkeypress="onkey(event)"/>
<button onclick="send()">发送</button>
</body>

</html>

web服务端
import struct,socket
import hashlib
import threading,random
from base64 import b64encode, b64decode

connectionlist = {}

def sendMessage(message):
global connectionlist
for connection in connectionlist.values():
connection.send(str.encode("\x00%s\xFF" % message))

def deleteconnection(item):
global connectionlist
del connectionlist['connection'+item]

class WebSocket(threading.Thread):

GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"

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 += 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(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(handshake))
self.handshaken = True
print ('Socket %s Handshaken with %s success!' %(self.index, self.remote))
sendMessage('Welcome, ' + self.name + ' !')

else:
mm=self.conn.recv(64)
print(mm.decode('utf-8', 'ignore'))
self.buffer +=mm.decode('utf-8', 'ignore')

if self.buffer.find("\xFF")!=-1:
s = self.buffer.split("\xFF")[0][1:]
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 = ""


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(("127.0.0.1",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()

说下配置 ,python3.4,websocket 13
无法模拟 服务器,希望有大神帮小弟解答下
...全文
553 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
luochengquan 2017-08-24
  • 打赏
  • 举报
回复
#解决中文 def parse_recv_data(msg): en_bytes = b'' cn_bytes = [] if len(msg) < 6: return '' v = msg[1] & 0x7f if v == 0x7e: p = 4 elif v == 0x7f: p = 10 else: p = 2 mask = msg[p:p + 4] data = msg[p + 4:] for k, v in enumerate(data): nv = chr(v ^ mask[k % 4]) nv_bytes = nv.encode() nv_len = len(nv_bytes) if nv_len == 1: en_bytes += nv_bytes else: en_bytes += b'%s' cn_bytes.append(ord(nv_bytes.decode())) if len(cn_bytes) > 2: # 字节数组转汉字 cn_str = '' clen = len(cn_bytes) count = int(clen / 3) for x in range(0, count): i = x * 3 b = bytes([cn_bytes[i], cn_bytes[i + 1], cn_bytes[i + 2]]) cn_str += b.decode() new = en_bytes.replace(b'%s%s%s', b'%s') new = new.decode() res = (new % tuple(list(cn_str))) else: res = en_bytes.decode() return res
wjzhangcsu 2016-08-09
  • 打赏
  • 举报
回复
楼主,你没有贴错代码,反而第二次贴的代码在Python3中不能运行
feixuyue 2015-02-14
  • 打赏
  • 举报
回复
贴错代码,更正如下:
import hashlib, struct
import socket111
import threading,random
from base64 import b64encode, b64decode
from xml import parsers
 
connectionlist = {}
 
def sendMessage(message):
    global connectionlist
    for connection in connectionlist.values():
        connection.send(str.encode(send_data(message)))
        
def deleteconnection(item):
    global connectionlist
    del connectionlist['connection'+item]
     

def parse_data(msg):
    if(msg.length<1):
         return ''
    code_length = ord(msg[1]) & 127
 
    if code_length == 126:
        masks = msg[4:8]
        data = msg[8:]
    elif code_length == 127:
        masks = msg[10:14]
        data = msg[14:]
    else:
        masks = msg[2:6]
        data = msg[6:]
 
    i = 0
    raw_str = ''
 
    for d in data:
        raw_str += chr(ord(d) ^ ord(masks[i%4]))
        i += 1     
    return raw_str
    
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):
    
    GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
    
    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 += 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(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\r\n"
                    
                    self.conn.send(str.encode(handshake))
                    self.handshaken = True  
                    print ('Socket %s Handshaken with %s success!' %(self.index, self.remote))  
                    sendMessage('Welcome, ' + self.name + ' !')  
                   
            else:
                mm=parse_data(self.conn.recv(64))
                print(mm)
                self.buffer +=mm.decode('utf-8')
                
                if self.buffer.find("\xFF")!=-1:
                    s = self.buffer.split("\xFF")[0][1:]
                    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 = ""
  
     
class WebSocketServer(object):
    def __init__(self):
        self.socket = None
    def begin(self):
        print( 'WebSocketServer Start!')
        self.socket = socket111.socket111(socket111.AF_INET, socket111.SOCK_STREAM)
        self.socket.bind(("127.0.0.1",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()
feixuyue 2015-02-14
  • 打赏
  • 举报
回复
正确代码附上:
#coding=utf8
#!/usr/bin/python

import struct,socket,sys
import hashlib
import threading,random
import time
from base64 import b64encode, b64decode


connectionlist = {}

#python3k 版本recv返回字节数组
def decode(data):
    if not len(data):
        return False
    length = data[1] & 127
    if length == 126:
        mask = data[4:8]
        raw = data[8:]
    elif length == 127:
        mask = data[10:14]
        raw = data[14:]
    else:
        mask = data[2:6]
        raw = data[6:]
    ret = ''
    for cnt, d in enumerate(raw):
        ret += chr(d ^ mask[cnt%4])
    return ret

def encode(data):  
    data=str.encode(data)
    head = b'\x81'

    if len(data) < 126:
        head += struct.pack('B', len(data))
    elif len(data) <= 0xFFFF:
        head += struct.pack('!BH', 126, len(data))
    else:
        head += struct.pack('!BQ', 127, len(data))
    return head+data
                
def sendMessage(message):
    global connectionlist
    for connection in connectionlist.values():
        connection.send(encode(message))
 
def deleteconnection(item):
    global connectionlist
    del connectionlist['connection'+item]

class WebSocket(threading.Thread):

    GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"

    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 += 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('Welcome, ' + self.name + ' !')  

            else:
                msg=decode(self.conn.recv(1024))    
                if msg=='quit':
                    print ('Socket%s Logout!' % (self.index))
                    nowTime = time.strftime('%H:%M:%S',time.localtime(time.time()))
                    sendMessage('%s %s say: %s' % (nowTime, self.remote, self.name+' Logout'))                      
                    deleteconnection(str(self.index))
                    self.conn.close()
                    break
                else:
                    print ('Socket%s Got msg:%s from %s!' % (self.index, msg, self.remote))
                    nowTime = time.strftime('%H:%M:%S',time.localtime(time.time()))
                    sendMessage('%s %s say: %s' % (nowTime, self.remote, msg))       
                
            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.bind(("127.0.0.1",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()
            connectionlist['connection'+str(i)]=connection
            i = i + 1

if __name__ == "__main__":
    server = WebSocketServer()
    server.begin()
feixuyue 2015-02-14
  • 打赏
  • 举报
回复
引用 8 楼 jiht594 的回复:
这回应该好了 ubuntu和windows都试过了. 一个python2.76 一个python2.79 python3不行.字符串不会弄

#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
        
def parse_data(msg):
    global g_code_length
    g_code_length = ord(msg[1]) & 127
    received_length = 0;
    if g_code_length == 126:
        g_code_length = struct.unpack('>H', str(msg[2:4]))[0]
        masks = msg[4:8]
        data = msg[8:]
    elif g_code_length == 127:
        g_code_length = struct.unpack('>Q', str(msg[2:10]))[0]
        masks = msg[10:14]
        data = msg[14:]
    else:
        masks = msg[2:6]
        data = msg[6:]

    i = 0
    raw_str = ''

    for d in data:
        raw_str += chr(ord(d) ^ ord(masks[i%4]))
        i += 1

    print (u"总长度是:%d" % int(g_code_length))    
    return raw_str  

def sendMessage(message):
    global connectionlist
    
    message_utf_8 = message.encode('utf-8')
    for connection in connectionlist.values():
        back_str = []
        back_str.append('\x81')
        data_length = len(message_utf_8)

        if data_length <= 125:
            back_str.append(chr(data_length))
        elif data_length <= 65535 :
            back_str.append(struct.pack('b', 126))
            back_str.append(struct.pack('>h', data_length))
            #back_str.append(chr(data_length >> 8))
            #back_str.append(chr(data_length & 0xFF))
            #a = struct.pack('>h', data_length)
            #b = chr(data_length >> 8)
            #c = chr(data_length & 0xFF)
        elif data_length <= (2^64-1):
            #back_str.append(chr(127))
            back_str.append(struct.pack('b', 127))
            back_str.append(struct.pack('>q', data_length))
            #back_str.append(chr(data_length >> 8))
            #back_str.append(chr(data_length & 0xFF))      
        else :
                print (u'太长了')        
        msg = ''
        for c in back_str:
            msg += c;
        back_str = str(msg)   + message_utf_8#.encode('utf-8')    
        #connection.send(str.encode(str(u"\x00%s\xFF\n\n" % message))) #这个是旧版
        #print (u'send message:' +  message)
        if back_str != None and len(back_str) > 0:
            print (back_str)
            connection.send(back_str)

def deleteconnection(item):
    global connectionlist
    del connectionlist['connection'+item]

class WebSocket(threading.Thread):#继承Thread

    GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"

    def __init__(self,conn,index,name,remote, path="/"):
        threading.Thread.__init__(self)#初始化父类Thread
        self.conn = conn
        self.index = index
        self.name = name
        self.remote = remote
        self.path = path
        self.buffer = ""
        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.name + ' !')  
                    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, self.name+' 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(("127.0.0.1",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()
已经解决了,多谢
jiht594 2015-02-14
  • 打赏
  • 举报
回复
这回应该好了 ubuntu和windows都试过了. 一个python2.76 一个python2.79 python3不行.字符串不会弄

#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
        
def parse_data(msg):
    global g_code_length
    g_code_length = ord(msg[1]) & 127
    received_length = 0;
    if g_code_length == 126:
        g_code_length = struct.unpack('>H', str(msg[2:4]))[0]
        masks = msg[4:8]
        data = msg[8:]
    elif g_code_length == 127:
        g_code_length = struct.unpack('>Q', str(msg[2:10]))[0]
        masks = msg[10:14]
        data = msg[14:]
    else:
        masks = msg[2:6]
        data = msg[6:]

    i = 0
    raw_str = ''

    for d in data:
        raw_str += chr(ord(d) ^ ord(masks[i%4]))
        i += 1

    print (u"总长度是:%d" % int(g_code_length))    
    return raw_str  

def sendMessage(message):
    global connectionlist
    
    message_utf_8 = message.encode('utf-8')
    for connection in connectionlist.values():
        back_str = []
        back_str.append('\x81')
        data_length = len(message_utf_8)

        if data_length <= 125:
            back_str.append(chr(data_length))
        elif data_length <= 65535 :
            back_str.append(struct.pack('b', 126))
            back_str.append(struct.pack('>h', data_length))
            #back_str.append(chr(data_length >> 8))
            #back_str.append(chr(data_length & 0xFF))
            #a = struct.pack('>h', data_length)
            #b = chr(data_length >> 8)
            #c = chr(data_length & 0xFF)
        elif data_length <= (2^64-1):
            #back_str.append(chr(127))
            back_str.append(struct.pack('b', 127))
            back_str.append(struct.pack('>q', data_length))
            #back_str.append(chr(data_length >> 8))
            #back_str.append(chr(data_length & 0xFF))      
        else :
                print (u'太长了')        
        msg = ''
        for c in back_str:
            msg += c;
        back_str = str(msg)   + message_utf_8#.encode('utf-8')    
        #connection.send(str.encode(str(u"\x00%s\xFF\n\n" % message))) #这个是旧版
        #print (u'send message:' +  message)
        if back_str != None and len(back_str) > 0:
            print (back_str)
            connection.send(back_str)

def deleteconnection(item):
    global connectionlist
    del connectionlist['connection'+item]

class WebSocket(threading.Thread):#继承Thread

    GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"

    def __init__(self,conn,index,name,remote, path="/"):
        threading.Thread.__init__(self)#初始化父类Thread
        self.conn = conn
        self.index = index
        self.name = name
        self.remote = remote
        self.path = path
        self.buffer = ""
        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.name + ' !')  
                    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, self.name+' 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(("127.0.0.1",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()
feixuyue 2015-02-13
  • 打赏
  • 举报
回复
Traceback (most recent call last): File "C:\Python34\lib\threading.py", line 921, in _bootstrap_inner self.run() File "C:\Users\hzm\workspace\python\socket111.py", line 98, in run sendMessage('Welcome, ' + self.name + ' !') File "C:\Users\hzm\workspace\python\socket111.py", line 50, in sendMessage connection.send(str.encode(back_str)) ConnectionAbortedError: [WinError 10053] 您的主机中的软件中止了一个已建立的连接。
feixuyue 2015-02-13
  • 打赏
  • 举报
回复
还是不行,可能解码和加密有问题
feixuyue 2015-02-13
  • 打赏
  • 举报
回复
引用 4 楼 jiht594 的回复:
def parse_data(msg):
    code_length = ord(msg[1]) & 127

    if code_length == 126:
        masks = msg[4:8]
        data = msg[8:]
    elif code_length == 127:
        masks = msg[10:14]
        data = msg[14:]
    else:
        masks = msg[2:6]
        data = msg[6:]

    i = 0
    raw_str = ''

    for d in data:
        raw_str += chr(ord(d) ^ ord(masks[i%4]))
        i += 1
    return raw_str  
        
def sendMessage(message):
    global connectionlist
    for connection in connectionlist.values():
        back_str = []
        back_str.append('\x81')
        data_length = len(message)
    
        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) + message        
        #connection.send(str.encode(str(u"\x00%s\xFF\n\n" % message))) #这个是旧版
        print (u'send message:' +  message)
        connection.send(back_str)
 

mm=self.conn.recv(64)
                msg = parse_data(mm) #utf8
                u_msg = msg.decode('utf-8', 'ignore') #unicode
                print (u_msg)
                sendMessage(msg)
你再试一下上面的代码 http://download.csdn.net/detail/jiht594/8443197
嗯,好的,key是websocket的服务端返回的秘钥。
jiht594 2015-02-12
  • 打赏
  • 举报
回复
端口换一个大的 比如12345
feixuyue 2015-02-12
  • 打赏
  • 举报
回复
引用 1 楼 jiht594 的回复:
端口换一个大的 比如12345
端口没问题,问题应该在websocket的返回令牌key的正确性
jiht594 2015-02-12
  • 打赏
  • 举报
回复
def parse_data(msg):
    code_length = ord(msg[1]) & 127

    if code_length == 126:
        masks = msg[4:8]
        data = msg[8:]
    elif code_length == 127:
        masks = msg[10:14]
        data = msg[14:]
    else:
        masks = msg[2:6]
        data = msg[6:]

    i = 0
    raw_str = ''

    for d in data:
        raw_str += chr(ord(d) ^ ord(masks[i%4]))
        i += 1
    return raw_str  
        
def sendMessage(message):
    global connectionlist
    for connection in connectionlist.values():
        back_str = []
        back_str.append('\x81')
        data_length = len(message)
    
        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) + message        
        #connection.send(str.encode(str(u"\x00%s\xFF\n\n" % message))) #这个是旧版
        print (u'send message:' +  message)
        connection.send(back_str)
 

mm=self.conn.recv(64)
                msg = parse_data(mm) #utf8
                u_msg = msg.decode('utf-8', 'ignore') #unicode
                print (u_msg)
                sendMessage(msg)
你再试一下上面的代码 http://download.csdn.net/detail/jiht594/8443197
jiht594 2015-02-12
  • 打赏
  • 举报
回复
引用 2 楼 feixuyue 的回复:
[quote=引用 1 楼 jiht594 的回复:] 端口换一个大的 比如12345
端口没问题,问题应该在websocket的返回令牌key的正确性[/quote] 我这是python2.7 .可以通信. 不过是乱码. 不知道你说的key是什么东西.

#coding=utf8
#!/usr/bin/python
from __future__ import print_function 
import struct,socket
import hashlib
import threading,random
from base64 import b64encode, b64decode

connectionlist = {}

def sendMessage(message):
    global connectionlist
    for connection in connectionlist.values():
        connection.send(str.encode(str(u"\x00%s\xFF" % message)))

def deleteconnection(item):
    global connectionlist
    del connectionlist['connection'+item]

class WebSocket(threading.Thread):

    GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"

    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 += 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('Welcome, ' + self.name + ' !')  

            else:
                mm=self.conn.recv(64)
                f = open("D:\\msg.bak", 'w+') 
                print("信息{0}".format(mm), file=f)  
                print("信息{0}".format(mm) )  
                f.close()
                #print(mm.decode('utf-8', 'ignore'))
                self.buffer +=mm.decode('utf-8', 'ignore')

                if self.buffer.find(u"\xFF")!=-1:
                    s = self.buffer.split("\xFF")[0][1:]
                    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 = ""


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(("127.0.0.1",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()
            connectionlist['connection'+str(i)]=connection
            i = i + 1

if __name__ == "__main__":
    server = WebSocketServer()
    server.begin()

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧