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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
| -
|
|
!
-
|
!
-
!
-
!
-
!
-
!
-
!
-
|
!
-
!
-
!
-
!
-
!
-
!
-
!
-
!
-
!
-
!
-
!
-
!
-
|
!
-
!
| import socket
import threading
import time
import sys
import tkinter as tk
class Com:
HOST = ''
PORT = 9998
clxa = [] return_from_worker = []
server_receiver = None
client_receiver = None
def start_server(self):
handle_thread = threading.Thread(target=self.server_thread, args=())
handle_thread.start()
def server_thread(self):
print("start server socket")
self.pid = 0
self.soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.soc.bind((self.HOST, self.PORT))
self.soc.listen(10)
while True:
con, address = self.soc.accept()
clx = (con, address, self.pid) self.clxa.append(clx) print("[connect]{}".format(address))
self.pid = self.pid+1
handle_thread = threading.Thread(
target=self.server_handler, args=(clx,))
handle_thread.start()
def server_handler(self, clx):
print("at server, connected, start handler")
con = clx[0] address = clx[1] pid = clx[2] while True:
try:
data = con.recv(1024) recv_line = data.decode("utf-8")
self.server_receiver.server_rx(recv_line, pid)
except socket.error: con.close() break
except:
print("server_handler receive error.")
break
def send_ith_worker(self, line, i):
cx = self.clxa[i]
try:
cx[0].send(line.encode('utf-8'))
except:
print("send_ith_worker error")
def start_client(self, host):
print("start client socket, connect, host="+host)
try:
self.soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.soc.connect((host, self.PORT))
self.handle_thread = threading.Thread(
target=self.client_handler, args=(self.soc,))
self.handle_thread.start()
except: print("connect error.")
def client_handler(self, soc):
print("at client, connected, start handler")
while True:
try:
data = soc.recv(1024)
line = data.decode("utf-8")
print("[receive]- {}".format(line))
(self.client_receiver).worker_rx(line)
except socket.error:
soc.close()
break
except:
print("client_handler, receive error.")
def get_client_number(self):
return len(self.clxa)
def send_to_server(self, line):
self.soc.send(bytes(line, "utf-8"))
def set_server_receiver(self, rec):
self.server_receiver = rec
def set_client_receiver(self, rec):
self.client_receiver = rec
def close_all(self):
for cx in self.clxa:
cx[0].close()
|