websocket 步骤 消息推送_WebSocket实现android消息推送

WebSocket实现android消息推送

WebSocket是HTML5出的协议,基于TCP。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。

WebSocket协议之前,双工通信是通过多个http链接来实现,这导致了效率低下。WebSocket解决了这个问题。

有了websocket协议,服务器就可以主动给客户端发送消息,而不是要等客户端的轮询。

实现一个简单的Websocket服务器

#-*- coding:utf8 -*-

import threading

import hashlib

import socket

import base64

global clients

clients = {}

#通知客户端

def notify(message):

for connection in clients.values():

connection.send('%c%c%s' % (0x81, len(message), message))

#客户端处理线程

class websocket_thread(threading.Thread):

def __init__(self, connection, username):

super(websocket_thread, self).__init__()

self.connection = connection

self.username = username

def run(self):

print 'new websocket client joined!'

data = self.connection.recv(1024)

headers = self.parse_headers(data)

token = self.generate_token(headers['Sec-WebSocket-Key'])

self.connection.send('\ HTTP/1.1 101 WebSocket Protocol Hybi-10\r\n\ Upgrade: WebSocket\r\n\ Connection: Upgrade\r\n\ Sec-WebSocket-Accept: %s\r\n\r\n' % token)

while True:

try:

data = self.connection.recv(1024)

except socket.error, e:

print "unexpected error: ", e

clients.pop(self.username)

break

data = self.parse_data(data)

if len(data) == 0:

continue

message = "来自服务端的消息: " + data

notify(message)

def parse_data(self, msg):

v = ord(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:]

return ''.join([chr(ord(v) ^ ord(mask[k%4])) for k, v in enumerate(data)])

def parse_headers(self, msg):

headers = {}

header, data = msg.split('\r\n\r\n', 1)

for line in header.split('\r\n')[1:]:

key, value = line.split(': ', 1)

headers[key] = value

headers['data'] = data

return headers

def generate_token(self, msg):

key = msg + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'

ser_key = hashlib.sha1(key).digest()

return base64.b64encode(ser_key)

#服务端

class websocket_server(threading.Thread):

def __init__(self, port):

super(websocket_server, self).__init__()

self.port = port

def run(self):

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

sock.bind(('0.0.0.0', self.port))

sock.listen(5)

print 'websocket server started!'

while True:

connection, address = sock.accept()

try:

username = "ID" + str(address[1])

thread = websocket_thread(connection, username)

thread.start()

clients[username] = connection

except socket.timeout:

print 'websocket connection timeout!'

if __name__ == '__main__':

server = websocket_server(9000)

server.start()

注意:这里服务器的ip设置最好设置为0.0.0.0,允许局域网其他计算机访问

网页端代码,用于向安卓端推送消息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值