/
server.py
93 lines (74 loc) · 2.61 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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import asyncio
from gi.repository import Gtk, GObject
import time
class myServer:
def __init__(self, controller):
self._controller=controller
self._users = {}
self._loop = asyncio.new_event_loop()
asyncio.set_event_loop(self._loop)
def broadcast(self):
coro = self.broadcast_async()
# self.loop.
# loop = asyncio.get_event_loop()
# future = asyncio.run_coroutine_threadsafe(coro,loop)
# asyncio.run(coro)
asyncio.run_coroutine_threadsafe(coro, self._loop)
# future.result()
def broadcast_async(self):
print('broadcasting')
for user in self._users.keys():
writer = self._users[user]['writer']
data = 'hello'.encode()
writer.write(data)
yield from writer.drain()
return "done"
@asyncio.coroutine
def handle_echo(self,reader, writer):
writer.write("hello".encode())
addr = writer.get_extra_info('peername')
self._users[addr]={'reader':reader,'writer':writer}
while True:
data = yield from reader.read(100)
message = data.decode()
if message=="close":
break
print(f"Received {message!r} from {addr!r}")
self._controller.message("add")
print(f"Send: {message!r}")
writer.write(data)
yield from writer.drain()
print("Close the connection")
writer.close()
def run(self):
coro = asyncio.start_server(self.handle_echo, '0.0.0.0', 8888, loop=self._loop)
server = self._loop.run_until_complete(coro)
self.aServer = server
# Serve requests until Ctrl+C is pressed
print('Serving on {}'.format(server.sockets[0].getsockname()))
try:
self._loop.run_forever()
except KeyboardInterrupt:
pass
# Close the server
server.close()
self._loop.run_until_complete(server.wait_closed())
self._loop.close()
def stop(self):
print('stopping asyncio')
self.aServer.close()
# await self.aServer.wait_closed()
# while self.aServer.wait_closed() == False:
# print("waiting for server to close")
# time.sleep(1)
# self.loop.close()
# loop = asyncio.get_event_loop()
# loop.close()
# t = asyncio.current_task()
# t.cancel()
# asyncio.stop()
if __name__ == "__main__":
server = Server(None)
# asyncio.run(server.main())
server.run()
print("closing server")