-
Notifications
You must be signed in to change notification settings - Fork 0
/
tankServerRIP.py
183 lines (173 loc) · 6.48 KB
/
tankServerRIP.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
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#Basic Architecture from Rohan's Example for Sockets
#Almost every method has been heavily altered except for handleClient
import socket
import threading
import random
from queue import Queue
def db(*whatever):
debug = True
if debug:
print(*whatever)
def position(tankNumber):
positions = [(50,50,0),(750,750,180),(750,50,270),(50,750,90)]
return positions[tankNumber]
spawns = []
HOST = "128.237.162.243"
PORT = 50003
BACKLOG = 4
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((HOST,PORT))
server.listen(BACKLOG)
db("looking for connection")
def handleClient(client, serverChannel, cID, clientele): #this adds the client ID and msg to Q
client.setblocking(1)
msg = ""
while True:
try:
msg += client.recv(10).decode("UTF-8") #creates message based on input
command = msg.split("\n") #splits message based on \n
while (len(command) > 1): #if we have a complete command
readyMsg = command[0] #the first part is rdy message to be run
msg = "\n".join(command[1:]) #the rest is shit that begins the next msg
serverChannel.put(str(cID) + "_" + readyMsg) #add client ID and rdy msg to Q
command = msg.split("\n") #go to next command (if there is one)
except: #if gets bad shit, remove client
clientele.pop(cID)
return
def serverThread(clientele, serverChannel): #processes shit on the Q
peopleReady = 0
while True:
msg = serverChannel.get(True, None) #get first item on Q
db("msg recv: ", msg) #print the message rcvd!
senderID, msg = int(msg.split("_")[0]), "_".join(msg.split("_")[1:]) #separates id from msg
if (msg):
action = (msg.split(":")[0])
if action=="keyPressed":
dir = (msg.split(":")[1])
sendMsg = action+":"+dir+":"+str(senderID)+":\n"#msg for all players
for cID in clientele: #for each client
if cID != senderID: #if client not the sender
clientele[cID].send(sendMsg.encode()) #encode and send to Client object in dict
if action=="keyReleased":
dir = (msg.split(":")[1])
sendMsg = action+":"+dir+":"+str(senderID)+":\n"#msg for all players
for cID in clientele:
if cID != senderID:
clientele[cID].send(sendMsg.encode())
# if dir=="forward":
# db ("Player" + str(senderID) + " pressed forward!")
# for cID in clientele: #for each client
# if cID != senderID: #if client not the sender
# sendMsg = "keyPressed:forward:"+str(senderID)+":"+"\n" #create message to all other players!
# clientele[cID].send(sendMsg.encode()) #encode and send to Client object in dict
# elif dir=="backward":
# db ("Player_" + str(senderID) + " pressed backward!")
# for cID in clientele:
# if cID != senderID:
# sendMsg = "keyPressed:backward:"+str(senderID)+":"+"\n"
# clientele[cID].send(sendMsg.encode())
# elif dir=="right":
# db ("Player_" + str(senderID) + " pressed right!")
# for cID in clientele:
# if cID != senderID:
# sendMsg = "keyPressed:right:"+str(senderID)+":"+"\n"
# clientele[cID].send(sendMsg.encode())
# elif dir=="left":
# db ("Player_" + str(senderID) + " pressed left!")
# for cID in clientele:
# if cID != senderID:
# sendMsg = "keyPressed:left:"+str(senderID)+":"+"\n"
# clientele[cID].send(sendMsg.encode())
elif action=="shoot":
db ("Player_" + str(senderID) + " shot!")
for cID in clientele:
if cID != senderID:
sendMsg = "shoot:"+str(senderID)+":"+"\n"
clientele[cID].send(sendMsg.encode())
elif action=="vertWall":
db ("Player_" + str(senderID) + " added a vertWall")
print (msg)
msg += "\n" #dont forget the goddamn new line char
for cID in clientele:
if cID != senderID:
clientele[cID].send(msg.encode()) #just send exact same message
elif action=="horWall":
db ("Player_" + str(senderID) + " added a horWall")
msg += "\n"
for cID in clientele:
if cID != senderID:
clientele[cID].send(msg.encode())
elif action=="spawn":
db ("Player_" + str(senderID) + " added a spawn")
msg += "\n"
for cID in clientele:
if cID != senderID:
clientele[cID].send(msg.encode())
msg = msg.split(":")
pos = (int(msg[1]),int(msg[2]),int(msg[3]))
spawns.append(pos)
elif action=="removeWall":
msg += "\n"
for cID in clientele:
if cID != senderID:
clientele[cID].send(msg.encode())
elif action=="removeSpawn":
msg += "\n"
for cID in clientele:
if cID != senderID:
clientele[cID].send(msg.encode())
msg = msg.split(":")
x,y = int(msg[1]),int(msg[2])
for spawn in spawns:
if spawn[0] == x and spawn[1] == y:
spawns.remove(spawn)
break
elif action=="ready":
peopleReady += 1
print ("peopleReady:", peopleReady)
if peopleReady == len(clientele):
sendStart()
elif action=="unready":
peopleReady -= 1
print ("peopleReady:", peopleReady)
elif action=="cursor":
msg += "\n"
for cID in clientele:
if cID != senderID:
clientele[cID].send(msg.encode())
serverChannel.task_done()
def sendStart():
# for cID in clientele:
# for number in range(len(spawns)):
# if number==cID:
# x,y,ang = spawns[number]
# clientele[cID].send(("player:%d:%d:%d:%d\n" %(cID,x,y,ang)).encode())
# else:
# x,y,ang = spawns[number]
# clientele[cID].send(("newPlayer:%d:%d:%d:%d\n" %(cID,x,y,ang)).encode())
msg = "start:\n"
for cID in clientele:
clientele[cID].send(msg.encode())
clientele = {}
currID = 0
serverChannel = Queue(100) #initialize Q
threading.Thread(target = serverThread, args = (clientele, serverChannel)).start()
#start_new_thread(serverThread, (clientele, serverChannel))
while True: #loop for adding clients
client, address = server.accept()
# db(currID) #curr client ID
x,y,ang = position(currID) #get the position of new tank
print(x)
print (y)
print (ang)
client.send(("player:%d:%d:%d:%d\n" %(currID,x,y,ang)).encode()) #send player info!
for cID in clientele: #tell all other peoples that there is a new player!
db (repr(cID), repr(currID))
clientele[cID].send(("newPlayer:%d:%d:%d:%d\n" %(currID,x,y,ang)).encode()) #send new player info!
x,y,ang = position(cID) #get the position of other tanks
client.send(("newPlayer:%d:%d:%d:%d\n" %(cID,x,y,ang)).encode()) #tell the new player about all the old players
clientele[currID] = client #adds a client object to dict?
db("connection received")
threading.Thread(target = handleClient, args = #create a new thread for this new client
(client ,serverChannel, currID, clientele)).start()
currID += 1