- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.py
More file actions
Latest commit
145 lines (126 loc) · 4.01 KB
/
Copy pathserver.py
File metadata and controls
145 lines (126 loc) · 4.01 KB
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
importsocket
importthreading
importqueue
importjson
importtime
importos
importos.path
importsys
IP='127.0.0.1'
PORT=50007
queue=queue.Queue() # client
users= [] # [conn, user, addr]
lock=threading.Lock() # multitreading lock
# client user list
defonlines():
online= []
foriinrange(len(users)):
online.append(users[i][1])
returnonline
classChatServer(threading.Thread):
globalusers, queue, lock
def__init__(self, port):
threading.Thread.__init__(self)
# self.setDaemon(True)
self.ADDR= ('', port)
# self.PORT = port
os.chdir(sys.path[0])
self.s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# self.conn = None
# self.addr = None
# client
deftcp_connect(self, conn, addr):
#username
user=conn.recv(1024)
user=user.decode()
# user listverification (no multiple same users)
foriinrange(len(users)):
ifuser==users[i][1]:
print('User already exist')
user=''+user+'_2'
ifuser=='no':
user=addr[0] +':'+str(addr[1])
users.append((conn, user, addr))
# Print new username
print(' New connection:', addr, ':', user, end='')
# refresh user list
d=onlines()
self.recv(d, addr)
try:
whileTrue:
data=conn.recv(1024)
data=data.decode()
self.recv(data, addr)
conn.close()
except:
print(user+' Connection lose')
# 把離開聊天室的從user list中移除
self.delUsers(conn, addr)
conn.close()
# 刪除user
defdelUsers(self, conn, addr):
a=0
foriinusers:
ifi[0] ==conn:
users.pop(a)
print(' Remaining online users: ',
end='')
d=onlines()
self.recv(d, addr)
# print
print(d)
break
a+=1
# ip, data, addrqueue
defrecv(self, data, addr):
lock.acquire()
try:
queue.put((addr, data))
finally:
lock.release()
# queue
defsendData(self):
whileTrue:
ifnotqueue.empty():
data=''
# queue
message=queue.get()
#string
ifisinstance(message[1], str):
foriinrange(len(users)):
# user[i][1], users[i][2]addr
forjinrange(len(users)):
ifmessage[0] ==users[j][2]:
print(
' this: message is from user[{}]'.format(j))
data=' '+users[j][1] +':'+message[1]
break
users[i][0].send(data.encode())
# data = data.split(':;')[0]
ifisinstance(message[1], list): # 同上
#list
data=json.dumps(message[1])
foriinrange(len(users)):
try:
users[i][0].send(data.encode())
except:
pass
defrun(self):
self.s.bind(self.ADDR)
self.s.listen(5)
print('Chat server starts running...')
q=threading.Thread(target=self.sendData)
q.start()
whileTrue:
conn, addr=self.s.accept()
t=threading.Thread(target=self.tcp_connect, args=(conn, addr))
t.start()
self.s.close()
if__name__=='__main__':
cserver=ChatServer(PORT)
cserver.start()
whileTrue:
time.sleep(1)
ifnotcserver.is_alive():
print("Chat connection lost...")
sys.exit(0)