Add some program notes

This commit is contained in:
snsd0805 2020-06-28 03:54:26 +08:00
parent 3d087babce
commit 7d520f9522
2 changed files with 51 additions and 29 deletions

30
draw.py
View File

@ -47,7 +47,7 @@ def sendDraw(sock):
pygame.draw.circle(screen,black,pygame.mouse.get_pos(),5,0) pygame.draw.circle(screen,black,pygame.mouse.get_pos(),5,0)
# feature
# 在鼠標周圍畫一個圓 # 在鼠標周圍畫一個圓
#for i in range(len(dotPos)-1): #for i in range(len(dotPos)-1):
# pygame.draw.line(screen,black,dotPos[i],dotPos[i+1],5) # pygame.draw.line(screen,black,dotPos[i],dotPos[i+1],5)
@ -62,21 +62,21 @@ def guessInput(screen):
guessStr = "" guessStr = ""
while True: while True:
for event in pygame.event.get() : for event in pygame.event.get() :
if event.type== pygame.QUIT: if event.type== pygame.QUIT: # close GUI
pygame.quit() pygame.quit()
sys.exit() sys.exit()
elif event.type == pygame.KEYDOWN: elif event.type == pygame.KEYDOWN: # Key down.
if event.key>=97 and event.key<122: if event.key>=97 and event.key<122: #a~z
guessStr = guessStr + chr(event.key) guessStr = guessStr + chr(event.key)
elif event.key == 13: #enter elif event.key == 13: #enter,send to server,clean
guessStr = "" guessStr = ""
elif event.key == 8 : #backspace elif event.key == 8 : #backspace
guessStr = guessStr[0:-1] guessStr = guessStr[0:-1]
pygame.draw.rect(screen,(171, 254, 250),[100,450,500,550],0) pygame.draw.rect(screen,(171, 254, 250),[100,450,500,550],0) # 輸入匡的矩形
pgStringVar = pygame.font.Font(None,30).render(guessStr,False,(0,0,0)) pgStringVar = pygame.font.Font(None,30).render(guessStr,False,(0,0,0))# 文字物件
print(guessStr) print(guessStr) # for test
screen.blit(pgStringVar,(120,455)) screen.blit(pgStringVar,(120,455))# draw font
pygame.display.update() pygame.display.update()
def receiveDraw(sock): def receiveDraw(sock):
@ -95,25 +95,21 @@ def receiveDraw(sock):
pygame.display.update() pygame.display.update()
print("draw start") print("draw start")
guessThreading = threading.Thread(target=guessInput,args=(screen,))# guest input guessThreading = threading.Thread(target=guessInput,args=(screen,)) # guest input
guessThreading.setDaemon(False) guessThreading.setDaemon(False)
guessThreading.start() guessThreading.start()
while True: while True:
data = sock.recv(1024).decode('utf-8') data = sock.recv(1024).decode('utf-8')
li = data.split('+') li = data.split('+') # 送來的座標可能一次有多個,規範以+隔開
#print((li))
for i in li: for i in li:
if i!="": if i!="":
#screen.fill((255, 255, 255)) # 切割取得座標
i = i.lstrip('(') i = i.lstrip('(')
i = i.rstrip(')') i = i.rstrip(')')
i = i.replace(',','') i = i.replace(',','')
i = i.split(' ') i = i.split(' ')
# 在鼠標周圍畫一個圓 print(i) #for test
#print(int(i[0]),int(i[1]))
print(i)
if len(i)==2 : # 防止傳送過程疏漏 if len(i)==2 : # 防止傳送過程疏漏
if i[0]!='' and i[1]!='': # 防止傳送過程疏漏 if i[0]!='' and i[1]!='': # 防止傳送過程疏漏
pos = (int(i[0]),int(i[1])) pos = (int(i[0]),int(i[1]))

50
main.py
View File

@ -8,6 +8,9 @@ class Server:
self.ip = ip self.ip = ip
self.port = port self.port = port
def start(self): def start(self):
# Base server
# Set the room for mainClient and redirect client into the room
print("Set server on {}:{}".format(self.ip,self.port)) print("Set server on {}:{}".format(self.ip,self.port))
listensock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) listensock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
listensock.bind((self.ip,self.port)) listensock.bind((self.ip,self.port))
@ -24,18 +27,20 @@ class Server:
print(data) print(data)
if data == "MAIN": if data == "MAIN":
sock.send("OK.SERVER".encode('utf-8')) sock.send("OK.SERVER".encode('utf-8'))
self.main(sock) self.main(sock) # Set main client mode
elif data == "CLIENT": elif data == "CLIENT":
sock.send("OK.CLIENT".encode('utf-8')) sock.send("OK.CLIENT".encode('utf-8'))
self.client(sock) self.client(sock) # Set client mode
else: else:
sock.send("FAIL".encode('utf-8')) sock.send("FAIL".encode('utf-8')) # Error type
def main(self,sock): def main(self,sock):
portNum = random.randint(1025,65535) #決定port portNum = random.randint(1025,65535) #決定port
roomNum = chr(random.randint(65,90)) + chr(random.randint(65,90)) roomNum = chr(random.randint(65,90)) + chr(random.randint(65,90)) # 隨機房號給client方便導向不需要ip:port
flag = 1 flag = 1
# 防止房號相同,若重複必須重新設定
while flag: while flag:
portNum = random.randint(1025,65535) #決定port portNum = random.randint(1025,65535) #決定port
roomNum = chr(random.randint(65,90)) + chr(random.randint(65,90)) roomNum = chr(random.randint(65,90)) + chr(random.randint(65,90))
@ -43,9 +48,15 @@ class Server:
for i in self.roomList: for i in self.roomList:
if i['portNum'] == portNum or i['roomNum'] == roomNum: if i['portNum'] == portNum or i['roomNum'] == roomNum:
flag =1 flag =1
room = Room(self.ip,portNum) room = Room(self.ip,portNum)
# Room process, process the game.
# Should handle all client which are redirected to this room.
roomProcess = multiprocessing.Process(target=room.start) roomProcess = multiprocessing.Process(target=room.start)
roomProcess.start() roomProcess.start()
# Set a list which save all rooms' info
self.roomList.append( self.roomList.append(
{ {
'portNum' : portNum, 'portNum' : portNum,
@ -53,26 +64,33 @@ class Server:
} }
) )
print(self.roomList) print(self.roomList)
# Let main client know the roomNumber.So it can connect to this room and share it's roomNumber to his/her friends.
sock.send("{} {}".format(roomNum,portNum).encode('utf-8')) sock.send("{} {}".format(roomNum,portNum).encode('utf-8'))
# def getPort(self):
# sock
def client(self,sock): def client(self,sock):
# Get roomNumber which client want to join.
receiveMsg = sock.recv(MAX).decode('utf-8') receiveMsg = sock.recv(MAX).decode('utf-8')
flag = False flag = False
for i in self.roomList: for i in self.roomList:
# Find PORT NUMBER to let clients' socket can connect to.
if i['roomNum'] == receiveMsg: if i['roomNum'] == receiveMsg:
# send PORT NUMBER to let client can connecte
sock.send(str(i['portNum']).encode('utf-8')) sock.send(str(i['portNum']).encode('utf-8'))
flag = True flag = True
if not flag: if not flag:
# NO THIS NUMBER
sock.send("FAIL".encode('utf-8')) sock.send("FAIL".encode('utf-8'))
class Room: class Room:
startFlag = False startFlag = False
sockList = [] sockList = [] # Client's sock list
def __init__(self,ip,portNum): def __init__(self,ip,portNum):
self.ip = ip self.ip = ip
self.portNum = portNum self.portNum = portNum
def start(self): def start(self):
# Build a room's socket to start game
listensock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) listensock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
listensock.bind((self.ip,self.portNum)) listensock.bind((self.ip,self.portNum))
print("\t{}:{}".format(self.ip,self.portNum)) print("\t{}:{}".format(self.ip,self.portNum))
@ -84,6 +102,7 @@ class Room:
self.sockList.append(sock) # 把sock放入list self.sockList.append(sock) # 把sock放入list
receiveDataThread = threading.Thread(target=self.receiveData,args=(sock,)) receiveDataThread = threading.Thread(target=self.receiveData,args=(sock,))
# 負責與client通信傳輸遊戲所必須的指令
receiveDataThread.start() receiveDataThread.start()
def connect(self): def connect(self):
@ -91,14 +110,18 @@ class Room:
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((self.ip,self.portNum)) sock.connect((self.ip,self.portNum))
return sock return sock
def receiveData(self,sock):
def receiveData(self,sock):
# room's socket receive MAINCLIENT'S mouse position.
# And send this MOUSE position to other client.
# Let them can draw the same picture on the screen
while True: while True:
origin = sock.recv(MAX) origin = sock.recv(MAX)
data = origin.decode('utf-8') data = origin.decode('utf-8')
if data: if data:
print(data) print(data)
for clientSock in self.sockList: # 遍歷socket list for clientSock in self.sockList: # 遍歷socket list
if clientSock != sock: # 不是自己的才傳送資料 if clientSock != sock: # 不是自己的才傳送資料.Needn't send position to MAIN
clientSock.send(origin) clientSock.send(origin)
class Client: class Client:
@ -107,6 +130,7 @@ class Client:
self.port = port self.port = port
def start(self): def start(self):
# START to choose MAIN OR CLIENT.
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((self.ip,self.port)) sock.connect((self.ip,self.port))
self.setType(sock) self.setType(sock)
@ -115,10 +139,11 @@ class Client:
print("Type in 'MAIN' to set a new room\nType in 'CLIENT' to join a room") print("Type in 'MAIN' to set a new room\nType in 'CLIENT' to join a room")
msg = input("> ") msg = input("> ")
sock.send(msg.encode('utf-8')) sock.send(msg.encode('utf-8'))
receiveMsg = sock.recv(MAX).decode('utf-8') receiveMsg = sock.recv(MAX).decode('utf-8') # Get response
if receiveMsg=="OK.SERVER": if receiveMsg=="OK.SERVER":
receiveMsg = sock.recv(MAX).decode('utf-8') receiveMsg = sock.recv(MAX).decode('utf-8')
print(receiveMsg) print(receiveMsg)
# get ROOMNUM and PORTNUM
connectData = receiveMsg.split(' ') connectData = receiveMsg.split(' ')
room = Room(self.ip,int(connectData[1])) room = Room(self.ip,int(connectData[1]))
sock = room.connect() # sock可覆蓋了 sock = room.connect() # sock可覆蓋了
@ -127,12 +152,13 @@ class Client:
# receiveDataThread.start() # receiveDataThread.start()
# sendDataThread = threading.Thread(target=self.sendData,args=(sock,)) # sendDataThread = threading.Thread(target=self.sendData,args=(sock,))
# sendDataThread.start() # sendDataThread.start()
draw.sendDraw(sock,) draw.sendDraw(sock,) # 開始繪圖
elif receiveMsg=="OK.CLIENT": elif receiveMsg=="OK.CLIENT":
roomNum = input("Room Number> ") roomNum = input("Room Number> ")
sock.send(roomNum.encode('utf-8')) sock.send(roomNum.encode('utf-8'))
receiveMsg = sock.recv(MAX).decode('utf-8') receiveMsg = sock.recv(MAX).decode('utf-8')
# Get port number
room = Room(self.ip,int(receiveMsg)) room = Room(self.ip,int(receiveMsg))
sock = room.connect() # sock可覆蓋了 sock = room.connect() # sock可覆蓋了
@ -140,7 +166,7 @@ class Client:
# receiveDataThread.start() # receiveDataThread.start()
# sendDataThread = threading.Thread(target=self.sendData,args=(sock,)) # sendDataThread = threading.Thread(target=self.sendData,args=(sock,))
# sendDataThread.start() # sendDataThread.start()
draw.receiveDraw(sock) draw.receiveDraw(sock) # Start to receive mouse position to draw picture what MAIN client draw.
else: else:
print("ERROR TYPE") print("ERROR TYPE")