|
1 | 1 | #!/usr/bin/env python |
2 | 2 | import socket as skt |
3 | 3 | from time import ctime |
| 4 | +import threading |
4 | 5 |
|
5 | 6 | BUFFER_SIZE = 1024 |
6 | 7 |
|
| 8 | +class MyThread(threading.Thread): |
| 9 | + """ tcp server threading main loop that communicate with client |
| 10 | + tcp_client_socket: the socket that return from accept method |
| 11 | + cli_addr: the address that return from accept method, a tuple |
| 12 | + """ |
| 13 | + def __init__(self, tcp_client_socket, cli_addr): |
| 14 | + super(MyThread, self).__init__() |
| 15 | + self.tcp_client_socket = tcp_client_socket |
| 16 | + self.cli_addr = cli_addr |
| 17 | + self.loop = False |
| 18 | + def run(self): |
| 19 | + self.loop = True |
| 20 | + while self.loop: |
| 21 | + data = self.tcp_client_socket.recv(BUFFER_SIZE) |
| 22 | + if not data: |
| 23 | + break |
| 24 | + self.tcp_client_socket.send('(%s) %s' % (ctime(), data)) |
| 25 | + |
| 26 | + def quit(self): |
| 27 | + self.loop = False |
| 28 | + |
7 | 29 | def run_tcp_server(host='', port=21567): |
8 | 30 | server_addr = (host, port) |
9 | 31 | tcp_server_socket = skt.socket(skt.AF_INET, skt.SOCK_STREAM) |
10 | 32 | tcp_server_socket.bind(server_addr) |
11 | 33 | tcp_server_socket.listen(5) |
| 34 | + client_skt_addr_dict = {} |
| 35 | + print 'waiting for connection...' |
12 | 36 |
|
13 | 37 | try: |
14 | 38 | while True: |
15 | | - print 'waiting for connetion...' |
16 | 39 | tcp_client_socket, cli_addr = tcp_server_socket.accept() |
17 | | - print '...conneted from:', cli_addr |
| 40 | + t = MyThread(tcp_client_socket, cli_addr) |
| 41 | + client_skt_addr_dict[(tcp_client_socket, cli_addr)] = t |
| 42 | + t.start() |
| 43 | + print '=' * 20 |
| 44 | + for d in client_skt_addr_dict: |
| 45 | + print client_skt_addr_dict[d] |
18 | 46 |
|
19 | | - while True: |
20 | | - data = tcp_client_socket.recv(BUFFER_SIZE) |
21 | | - if not data: |
22 | | - break |
23 | | - tcp_client_socket.send('(%s) %s' % (ctime(), data)) |
24 | 47 | except (KeyboardInterrupt, EOFError), err: |
25 | | - print 'got error', err |
| 48 | + print 'got error,cnt=', err, threading.active_count() |
| 49 | + for d in client_skt_addr_dict: |
| 50 | + t = client_skt_addr_dict[d] |
| 51 | + print 'cnt=', threading.active_count() |
| 52 | + t.quit() |
| 53 | + |
26 | 54 | tcp_client_socket.close() |
27 | 55 | tcp_server_socket.close() |
| 56 | + print client_skt_addr_dict, threading.active_count() |
28 | 57 |
|
29 | 58 | def run_tcp_client(host='localhost', port=21567): |
30 | 59 | tcp_client_socket = skt.socket(skt.AF_INET, skt.SOCK_STREAM) |
@@ -75,7 +104,7 @@ def run_udp_client(host='localhost', port=21567): |
75 | 104 | udp_client_socket.close() |
76 | 105 |
|
77 | 106 | if __name__ == '__main__': |
78 | | - #run_tcp_server() |
| 107 | + run_tcp_server() |
79 | 108 | #run_tcp_client(host='10.241.53.79') # server ip |
80 | | - run_udp_server() |
| 109 | + #run_udp_server() |
81 | 110 | #run_udp_client(host='10.241.53.79') # server ip |
0 commit comments