Skip to content

Commit 31e9038

Browse files
committed
use class to reconstruct server
1 parent 3e65cf6 commit 31e9038

File tree

4 files changed

+52
-32
lines changed

4 files changed

+52
-32
lines changed

echo/__init__.py

Whitespace-only changes.

echo/base_server.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import socket
2+
3+
4+
class BaseServer:
5+
def __init__(self, address):
6+
self.listener = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
7+
self.listener.bind(address)
8+
self.listener.listen()
9+
10+
def start_sering(self):
11+
raise NotImplemented
12+

echo/echo_server_thread.py

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,25 @@
44
import socket
55
import threading
66

7+
from echo.base_server import BaseServer
78

8-
def accept(s: socket.socket):
9-
while data := s.recv(1024):
10-
s.send(data)
11-
# sum(range(100000)) # cpu bound task
12-
print(f'Echo: {data}')
13-
s.close()
14-
print(f'Remove: {s}')
9+
10+
class ThreadServer(BaseServer):
11+
def start_sering(self):
12+
while True:
13+
s, addr = self.listener.accept()
14+
print(f'Connection: {addr}')
15+
threading.Thread(target=self.handler, args=(s,)).start()
16+
17+
def handler(self, s: socket.socket):
18+
while data := s.recv(1024):
19+
s.send(data)
20+
# sum(range(100000)) # cpu bound task
21+
print(f'Echo: {data}')
22+
s.close()
23+
print(f'Remove: {s}')
1524

1625

1726
if __name__ == '__main__':
18-
server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
19-
server_sock.bind(('', 6666))
20-
server_sock.listen()
21-
threads = []
22-
while True:
23-
s, addr = server_sock.accept()
24-
print(f'Connection: {addr}')
25-
t = threading.Thread(target=accept, args=(s,))
26-
threads.append(t)
27-
t.start()
27+
server = ThreadServer(("127.0.0.1", 6666))
28+
server.start_sering()

echo/echo_server_threadpool.py

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,29 @@
11
import socket
22
from concurrent.futures import ThreadPoolExecutor
33

4+
from echo.base_server import BaseServer
45

5-
def accept(s: socket.socket):
6-
while data := s.recv(1024):
7-
s.send(data)
8-
# sum(range(100000)) # slow down respond
9-
print(f'Echo: {data}')
10-
s.close()
11-
print(f'Remove: {s}')
6+
7+
class ThreadPoolServer(BaseServer):
8+
def __init__(self, address=("127.0.0.1", 6666)):
9+
super(ThreadPoolServer, self).__init__(address)
10+
self.pool = ThreadPoolExecutor()
11+
12+
def start_sering(self):
13+
while True:
14+
s, addr = self.listener.accept()
15+
print(f'Connection: {addr}')
16+
self.pool.submit(self.handler, s)
17+
18+
def handler(self, sock: socket.socket):
19+
while data := sock.recv(1024):
20+
sock.send(data)
21+
# sum(range(100000)) # slow down respond
22+
print(f'Echo: {data}')
23+
sock.close()
24+
print(f'Remove: {sock}')
1225

1326

1427
if __name__ == '__main__':
15-
pool = ThreadPoolExecutor()
16-
server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
17-
server_sock.bind(('', 6666))
18-
server_sock.listen()
19-
while True:
20-
s, addr = server_sock.accept()
21-
print(f'Connection: {addr}')
22-
pool.submit(accept, s)
28+
server = ThreadPoolServer()
29+
server.start_sering()

0 commit comments

Comments
 (0)