服务端
import os
import random
import time
import threading
from socket import *
IP = '127.0.0.1'
serverPort = 12000
MAX_CONNECTION = 5
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.bind((IP, serverPort))
serverSocket.listen(MAX_CONNECTION)
print('server prepared')
players = []
last_message = [0, 0]
last_player = ''
start = False
def play():
global last_message, last_player
while True:
for player in players:
while True:
player.send("ACK")
message = player.recv()
if message == 'ACK':
continue
for rev in players:
rev.send(message)
if message.split('\n')[-1] == 'want':
print(last_message)
result = [0 for i in range(0, 6)]
for p in players:
for index in p.list:
result[index - 1] += 1
print(result)
if last_message[0] > result[last_message[1] - 1]:
last_player.lose(result)
else:
player.lose(result)
for p in players:
p.restart()
return
# Player lose
# print(str(p.name) + " " + str(p.list))
else:
last_player = player
last_message = message.split('\n')[-1].split('个')
last_message = [int(i) for i in last_message]
break
def snake():
global last_message, last_player
while True:
play()
def userRandomList():
return [random.randint(1, 6) for i in range(0, 5)]
def timemark():
timestamp = int(time.time())
timestr = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(timestamp))
return '[' + timestr + ']'
def uRLtoString(uRL):
url = ""
for i in uRL:
url += str(i) + " "
return url + "\n"
class player:
global players, last_player, last_message, start
def __init__(self, sk, name):
self.socket = sk
self.list = userRandomList()
self.name = name
self.socket.send(str(self.list).encode())
def restart(self):
self.list = userRandomList()
self.socket.send(str(self.list).encode())
def send(self, m):
self.socket.send(m.encode())
def recv(self):
return self.socket.recv(1024).decode()
def lose(self, result):
global players, last_player, last_message, start
answer = "result:\n"
for i in range(0, len(result)):
answer += str(result[i]) + "个" + str(i + 1) + "\n"
for player in players:
player.send(answer)
player.send(self.name + " lose")
index = players.index(self)
print("index:"+str(index))
players = [players[(i + index + len(players)) % len(players)] for i in range(0, len(players))]
for player in players:
print(player.name)
last_player = ''
last_message = [0, 1]
start = True
print("wait for next game..")
time.sleep(2)
runningSnack = threading.Thread(target=snake)
# runningSnack.setDaemon(True)
runningSnack.start()
while True:
connectionSocket, addr = serverSocket.accept()
try:
Player = player(connectionSocket, connectionSocket.recv(2048).decode().split(' ')[0])
players.append(Player)
except Exception as e:
print(timemark() + repr(e))
客户端
import os
import uuid
import time
import threading
from socket import *
from tkinter import *
import re
serverName = '127.0.0.1' # 服务器外网IP
serverPort = 12000
name = str(__file__).split('\\')[-1]
root = Tk()
root.title(name)
text = Text(root, width=70, height=15)
scroll = Scrollbar(root)
scroll.pack(side=RIGHT, fill=Y)
scroll.config(command=text.yview)
text.config(yscrollcommand=scroll.set)
text.pack()
entry = Entry(root, bd=5, width=60)
entry.pack(side=LEFT)
clientSocket = socket(AF_INET, SOCK_STREAM)
print('正在连接...')
clientSocket.connect((serverName, serverPort))
print('连接成功!')
clientSocket.send((name + " join").encode())
text.see(END)
last = [0, 1]
def get_mac_address():
mac = uuid.UUID(int=uuid.getnode()).hex[-12:]
return ':'.join([mac[e:e + 2] for e in range(0, 11, 2)])
def timemark():
timestamp = int(time.time())
timestamp = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(timestamp))
return '[' + timestamp + ']'
def send():
global last
message = entry.get()
if message == '':
text.config(state='normal')
text.insert(END, '发送内容不能为空!\n')
text.see(END)
text.config(state='disabled')
else:
try:
if message != 'want':
re.match('\d+个\d+', message).group()
now = message.split('个')
now = [int(i) for i in now]
if 0 < now[1] < 7 and (
now[0] - last[0] > 0 or (now[0] - last[0] == 0 and now[1] - last[1] > 0)):
last = now
else:
print(1 / 0)
else:
print("等待一秒试试")
time.sleep(1)
if last == [0, 1]:
text.config(state='normal')
text.insert(END, '目前不能发送want 或者是用户未遵守规则\n')
text.see(END)
text.config(state='disabled')
clientSocket.send('ACK'.encode())
return
last = [0, 1]
clientSocket.send((timemark() + ' ' + get_mac_address() + ' - ' +
name + '\n' + message).encode())
except:
clientSocket.send('ACK'.encode())
text.config(state='normal')
text.insert(END, '发送内容不符合正则 或者是 用户输入没有按照规则\n')
text.see(END)
text.config(state='disabled')
# clientSocket.send((timemark() + ' ' + get_mac_address() + ' - ' +
# name + '\n ' + entry.get()).encode())
entry.delete(0, 'end')
button.config(state="disabled")
button = Button(root, text='发送', command=send, bg="green", fg="white", font=('软体雅黑', 18, 'bold'), width=10, height=1)
button.config(state="disabled")
button.pack(side=RIGHT)
class myThread(threading.Thread):
global last
def __init__(self):
threading.Thread.__init__(self)
def run(self):
global last
while True:
msg = clientSocket.recv(2048)
if msg.decode() == "ACK":
button.config(state="normal")
else:
try:
re.match('\d+个\d+', msg.decode().split('\n')[-1]).group()
now = msg.decode().split('\n')[-1].split('个')
print("now" + str(now))
now = [int(i) for i in now]
last = now
except:
last = [0,1]
text.config(state='normal')
text.insert(END, msg.decode() + '\n')
text.see(END)
text.config(state='disabled')
print("last"+str(last))
textThread = myThread()
textThread.start()
root.mainloop()
服务器先开,等到cmd出现server prepared,可以开启任意数量客户端