1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
import socket
from simplejson.encoder import JSONEncoder
encode = JSONEncoder().encode
END = '\r\n'
LQUEUE_SIZE = 500
BUFFER_SIZE = 4096
def client_socket(addr, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setblocking(0)
sock.connect_ex((addr, port))
return sock
def debug(data):
pass
class Client(object):
version = 'Orbit 1.0'
def __init__(self, addr="localhost", port=9000):
self.addr = addr
self.port = port
self.socket = None
self.id = 0
self.connected = False
def connect(self):
self.connected = True
if self.socket:
debug("Already Connected")
return
self.socket = client_socket(self.addr, self.port)
self.socket.setblocking(1)
def disconnect(self):
self.connected = False
self.socket.close()
self.socket = None
def reconnect(self):
self.disconnect()
self.connect()
def sendline(self, line=""):
self.socket.send('%s%s' % (line, END))
def event(self, recipients, body, json=True, retry=True):
if not self.connected:
self.connect()
try:
if json:
body = encode(body)
if not self.socket:
raise "ConnectionLost"
try:
self.id += 1
self.sendline(self.version)
self.sendline('Event')
self.sendline('id: %s' % self.id)
for recipient in recipients:
self.sendline('recipient: %s' % (str(recipient)))
self.sendline('length: %s' % len(body))
self.sendline()
self.socket.send(body)
return self.read_response()
except socket.error:
self.disconnect()
raise "ConnectionLost"
except "ConnectionLost":
if retry:
self.reconnect()
self.event(recipients, body, json, False)
else:
raise
def read_response(self):
return self.socket.recv(BUFFER_SIZE)
client = Client()
user_key = "user, 0, /demo"
headers = "HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n"
client.event([user_key], headers, False)
client.event([user_key], "Hello from python!<br>", False)
client.event([user_key], "Hello <b>again</b><br>", False)
|