程序可以在 Python 2.7 中运行,但不能在 3.10 中运行

发布于 2025-01-11 05:25:58 字数 5418 浏览 3 评论 0原文

所以基本上我用 python 做了一个 LAN 石头剪刀布..我设法让它在 python 2.7 上运行得很好,但是当我用 3.10 运行它时,它似乎无缘无故地陷入了无限循环..(我已经包含了一个代码中的注释 (#) 向您展示卡在哪里)

这是 3 个脚本

服务器脚本 2.7(两者的服务器脚本相同,所以这也是 3.10)

import socket
import threading


Host=("localhost")
Port=9090

Server=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Server.bind((Host, Port))
Server.listen(5)

Clients=[]
Players=[]
PlayersMoved=[0,0]
Moves=[0,0]



def Broadcast(Result):
    for Client in Clients:
        Client.send(Result)


def Game(Moves):
    # 1=Rock, 2=Paper, 3=Scissors
    if Moves[0]==1:
        if Moves[1]==1:
            Result="Tie"
        elif Moves[1]==2:
            Result=str(PlayersMoved[1]+" Won")
        elif Moves[1]==3:
            Result=str(PlayersMoved[0]+" Won")

    elif Moves[0]==2:
        if Moves[1]==2:
            Result="Tie"
        elif Moves[1]==3:
            Result=str(PlayersMoved[1]+" Won")
        elif Moves[1]==1:
            Result=str(PlayersMoved[0]+" Won")

    elif Moves[0]==3:
        if Moves[1]==3:
            Result="Tie"
        elif Moves[1]==1:
            Result=str(PlayersMoved[1]+" Won")
        elif Moves[1]==2:
            Result=str(PlayersMoved[0]+" Won")
    print ("im here7")
    Broadcast(Result)


def GetMoves(Client):
    while True:
        try:
            Message=Client.recv(1024)
            PlayerMove=""
            Parted=False
            for i in range(len(list(Message))):
                if Message[i]==":":
                    Parted=True
                    print ("im here2")
                    pass
                elif not Parted:
                    PlayerMove+=list(Message)[i]
                    print ("im here1")
                elif Parted:
                    Move=int(Message[i+1])
                    print ("im here3")
                    break


            if PlayersMoved[0]==0:
                PlayersMoved[0]=PlayerMove
                Moves[0]=Move
                print ("im here5")
            else:
                PlayersMoved[1]=PlayerMove
                Moves[1]=Move
                print ("im here6")
                Process2=threading.Thread(target=Game, args=(Moves,))
                Process2.start()

        except:
            index=Clients.index(Client)
            Clients.remove(Client)
            Client.close()
            Player=Players[index]
            Broadcast(str(Player+" left!").encode('ascii'))
            Players.remove(Player)
            break


def Connections():
    while True:
        Client, Address=Server.accept()
        print("Connected with ",Address)
        Client.send('NICK'.encode('ascii'))
        Player=Client.recv(1024).decode('ascii')
        Players.append(Player)
        Clients.append(Client)
        print("Nickname is ",Player)
        Broadcast(str(Player+" joined!").encode('ascii'))
        Client.send('Connected to server!'.encode('ascii'))
        Process1=threading.Thread(target=GetMoves, args=(Client,))
        Process1.start()



print ("Server is listening...")
Connections()

客户端 2.7

import socket
import threading


Nickname=raw_input("Choose your nickname: ")

Host=("localhost")
Port=9090

Client=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Client.connect((Host, Port))

def Receive():
    while True:
        try:
            Message=Client.recv(1024).decode('ascii')
            print (Message)
            if Message=='NICK':
                Client.send(str(Nickname).encode('ascii'))
                print ("im here1")
            else:
                print ("im here2")
                print(Message)
        except:
            print("An error occured!")
            Client.close()
            break

def Write():
    while True:
        MyMove=str(Nickname+": "+raw_input("1=Rock, 2=Paper, 3=Scissors:"))
        while MyMove!=str(Nickname+": 1") and MyMove!=str(Nickname+": 2") and MyMove!=str(Nickname+": 3"):
            MyMove=str(Nickname+": "+raw_input("1=Rock, 2=Paper, 3=Scissors:"))
        Client.send(MyMove.encode('ascii'))
        break


Receive_Thread=threading.Thread(target=Receive)
Receive_Thread.start()

Write_Thread=threading.Thread(target=Write)
Write_Thread.start()

客户端3.10

import socket
import threading


Nickname=str(input("Choose your nickname: "))

Host=("localhost")
Port=9090

Client=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Client.connect((Host, Port))

def Receive():
    while True:
        try:
            Message=Client.recv(1024).decode('ascii')
            print (Message)
            if Message=='NICK':
                Client.send(str(Nickname).encode('ascii'))
                print ("im here1")
            else:
                print ("im here2") #(it gets stuck here)
                print(Message)     #(it gets stuck here)
        except:
            print("An error occured!")
            Client.close()
            break

def Write():
    while True:
        MyMove=str(Nickname+": "+str(input("1=Rock, 2=Paper, 3=Scissors:")))
        while MyMove!=str(Nickname+": 1") and MyMove!=str(Nickname+": 2") and MyMove!=str(Nickname+": 3"):
            MyMove=str(Nickname+": "+str(input("1=Rock, 2=Paper, 3=Scissors:")))
        Client.send(MyMove.encode('ascii'))
        break


Receive_Thread=threading.Thread(target=Receive)
Receive_Thread.start()

Write_Thread=threading.Thread(target=Write)
Write_Thread.start()

So basically i made a LAN Rock Paper Scissors in python.. i managed to make it work just fine on python 2.7 but when i run it with 3.10 it seems to get stuck on an infinite loop for no reason.. (i have included a comment (#) in the code to show you where it gets stuck)

heres the 3 Scripts

Server Script 2.7 (Server Script is the same for both so this is the 3.10 too)

import socket
import threading


Host=("localhost")
Port=9090

Server=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Server.bind((Host, Port))
Server.listen(5)

Clients=[]
Players=[]
PlayersMoved=[0,0]
Moves=[0,0]



def Broadcast(Result):
    for Client in Clients:
        Client.send(Result)


def Game(Moves):
    # 1=Rock, 2=Paper, 3=Scissors
    if Moves[0]==1:
        if Moves[1]==1:
            Result="Tie"
        elif Moves[1]==2:
            Result=str(PlayersMoved[1]+" Won")
        elif Moves[1]==3:
            Result=str(PlayersMoved[0]+" Won")

    elif Moves[0]==2:
        if Moves[1]==2:
            Result="Tie"
        elif Moves[1]==3:
            Result=str(PlayersMoved[1]+" Won")
        elif Moves[1]==1:
            Result=str(PlayersMoved[0]+" Won")

    elif Moves[0]==3:
        if Moves[1]==3:
            Result="Tie"
        elif Moves[1]==1:
            Result=str(PlayersMoved[1]+" Won")
        elif Moves[1]==2:
            Result=str(PlayersMoved[0]+" Won")
    print ("im here7")
    Broadcast(Result)


def GetMoves(Client):
    while True:
        try:
            Message=Client.recv(1024)
            PlayerMove=""
            Parted=False
            for i in range(len(list(Message))):
                if Message[i]==":":
                    Parted=True
                    print ("im here2")
                    pass
                elif not Parted:
                    PlayerMove+=list(Message)[i]
                    print ("im here1")
                elif Parted:
                    Move=int(Message[i+1])
                    print ("im here3")
                    break


            if PlayersMoved[0]==0:
                PlayersMoved[0]=PlayerMove
                Moves[0]=Move
                print ("im here5")
            else:
                PlayersMoved[1]=PlayerMove
                Moves[1]=Move
                print ("im here6")
                Process2=threading.Thread(target=Game, args=(Moves,))
                Process2.start()

        except:
            index=Clients.index(Client)
            Clients.remove(Client)
            Client.close()
            Player=Players[index]
            Broadcast(str(Player+" left!").encode('ascii'))
            Players.remove(Player)
            break


def Connections():
    while True:
        Client, Address=Server.accept()
        print("Connected with ",Address)
        Client.send('NICK'.encode('ascii'))
        Player=Client.recv(1024).decode('ascii')
        Players.append(Player)
        Clients.append(Client)
        print("Nickname is ",Player)
        Broadcast(str(Player+" joined!").encode('ascii'))
        Client.send('Connected to server!'.encode('ascii'))
        Process1=threading.Thread(target=GetMoves, args=(Client,))
        Process1.start()



print ("Server is listening...")
Connections()

Client 2.7

import socket
import threading


Nickname=raw_input("Choose your nickname: ")

Host=("localhost")
Port=9090

Client=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Client.connect((Host, Port))

def Receive():
    while True:
        try:
            Message=Client.recv(1024).decode('ascii')
            print (Message)
            if Message=='NICK':
                Client.send(str(Nickname).encode('ascii'))
                print ("im here1")
            else:
                print ("im here2")
                print(Message)
        except:
            print("An error occured!")
            Client.close()
            break

def Write():
    while True:
        MyMove=str(Nickname+": "+raw_input("1=Rock, 2=Paper, 3=Scissors:"))
        while MyMove!=str(Nickname+": 1") and MyMove!=str(Nickname+": 2") and MyMove!=str(Nickname+": 3"):
            MyMove=str(Nickname+": "+raw_input("1=Rock, 2=Paper, 3=Scissors:"))
        Client.send(MyMove.encode('ascii'))
        break


Receive_Thread=threading.Thread(target=Receive)
Receive_Thread.start()

Write_Thread=threading.Thread(target=Write)
Write_Thread.start()

Client 3.10

import socket
import threading


Nickname=str(input("Choose your nickname: "))

Host=("localhost")
Port=9090

Client=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Client.connect((Host, Port))

def Receive():
    while True:
        try:
            Message=Client.recv(1024).decode('ascii')
            print (Message)
            if Message=='NICK':
                Client.send(str(Nickname).encode('ascii'))
                print ("im here1")
            else:
                print ("im here2") #(it gets stuck here)
                print(Message)     #(it gets stuck here)
        except:
            print("An error occured!")
            Client.close()
            break

def Write():
    while True:
        MyMove=str(Nickname+": "+str(input("1=Rock, 2=Paper, 3=Scissors:")))
        while MyMove!=str(Nickname+": 1") and MyMove!=str(Nickname+": 2") and MyMove!=str(Nickname+": 3"):
            MyMove=str(Nickname+": "+str(input("1=Rock, 2=Paper, 3=Scissors:")))
        Client.send(MyMove.encode('ascii'))
        break


Receive_Thread=threading.Thread(target=Receive)
Receive_Thread.start()

Write_Thread=threading.Thread(target=Write)
Write_Thread.start()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文