-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.py
76 lines (58 loc) · 2.12 KB
/
server.py
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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from twisted.internet import reactor, protocol
from itertools import count
# list of clients currently connected
clients = []
# an incrementing number
clientcounter = count(1)
class MyProtocol(protocol.Protocol):
def connectionMade(self):
'''
When a connection is made, we tell everyone that that person
has joined, using a number from the clientcounter
'''
global clientcounter, clients
self.clientnum = clientcounter.next()
clients.append(self)
print 'Client joined', self.clientnum
for client in clients:
client.transport.write("%s joined\n" % (self.clientnum,))
def dataReceived(self, data):
'''
Announce data to everyone connected when it arrives.
if 'quit' is sent, we disconnect from that client.
'''
global clients
print self.clientnum, 'said', data.strip()
for client in clients:
client.transport.write("%s said %s\n" % (self.clientnum, data.rstrip()))
if data.strip() == 'quit':
print "hum client", self.clientnum, "disconnecting"
self.transport.loseConnection()
def connectionLost(self, reason):
'''
Clean up clients list to not include this client.
'''
global clients
clients.remove(self)
print 'Client has quitted', self.clientnum
class MyFactory(protocol.Factory):
protocol = MyProtocol
class AnnounceServer(protocol.DatagramProtocol):
def datagramReceived(self, data, (host, port)):
self.transport.write(str(theport) + '\n', (host, port))
def main():
global theport
# start a chat server
port = reactor.listenTCP(0, MyFactory())
# start a udp listener
reactor.listenUDP(9300, AnnounceServer())
# record the port the chat server is listening on
theport = port.getHost().port
# print it out so we can see.
print 'the port is', theport
# Run The Network Event Loop
reactor.run()
if __name__ == '__main__':
main()