远程Bet python网络编程

服务端

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,可以开启任意数量客户端

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

alasnot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值