【问题标题】:Socket Program Python套接字程序 Python
【发布时间】:2017-10-19 17:47:13
【问题描述】:

我正在制作一个刽子手游戏。我正在尝试向服务器发送如果 loss == 7,则 lossGame = true。而在客户端,如果 lostGame 为真,则打印出游戏已经输掉。我匹配了发送和接收,但它不工作,并不断要求输入猜测字母。你知道我做错了什么吗?

我认为这是问题所在。

谢谢!

服务器:

import sys

# Import socket library
from socket import *

if sys.argv.__len__() != 2:
    serverPort = 5895
# Get port number from command line
else:
    serverPort = int(sys.argv[1])

# Choose SOCK_STREAM, which is TCP
# This is a welcome socket
serverSocket = socket(AF_INET, SOCK_STREAM)

serverSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)

# Start listening on specified port
serverSocket.bind(('', serverPort))

# Listener begins listening
serverSocket.listen(1)

print("The server is ready to receive")

#Set secret word
word = 'arkansas'
linesForString = ''     
#Prints out number of letters
for x in word:
    linesForString += '_'

newWord = 'arkansas'

# Wait for connection and create a new socket
# It blocks here waiting for connection
connectionSocket, addr = serverSocket.accept()
win = ' '
#Sends lines of words
linesInBytes = linesForString.encode('utf-8')
connectionSocket.send(linesInBytes)

lose = 0
while 1:


    l = list(word)
    list2 = list(linesForString)

    win = False 

    while 1:

        while win == False:
            losee = 0
            # Receives Letter
            letter = connectionSocket.recv(1024)
            letterString = letter.decode('utf-8')

            for x in range(len(list2)): 
                if(list2[x] == '_'):
                    if(letterString == l[x]):
                        list2[x] = letterString     

            for x in range(len(word)):
                if(letterString == word[x]):
                    losee = -1
            if (losee != -1):
                lose += 1

            print(lose)
            newWord = "".join(list2)

            #Sends newWord
            newWordInBytes = newWord.encode('utf-8')
            connectionSocket.send(newWordInBytes, lose)


            if(newWord == 'arkansas'):
                win = True
                winGame = 'You have won the game'
                winGameInBytes = winGame.encode('utf-8')
                connectionSocket.send(winGameInBytes)
                connectionSocket.close()


            if(lose == 7):
                loseGame = 'true'
                connectionSocket.close()
            else: 
                loseGame = 'false'

            #THIS IS WHERE THE PROBLEM IS
            loseGameInBytes = loseGame.encode('utf-8')
            connectionSocket.send(loseGameInBytes)  

# Close connection to client but do not close welcome socket
connectionSocket.close()

客户:

import sys

# Import socket library
from socket import *

if sys.argv.__len__() != 3:
    serverName = 'localhost'
    serverPort = 5895
# Get from command line
else:
    serverName = sys.argv[1]
    serverPort = int(sys.argv[2])

# Choose SOCK_STREAM, which is TCP
clientSocket = socket(AF_INET, SOCK_STREAM)

# Connect to server using hostname/IP and port
clientSocket.connect((serverName, serverPort))

#Recieves lines of words
linesInBytes = clientSocket.recv(1024)
lines = linesInBytes.decode('utf-8') 
for x in lines:
    print(x, end = " ")

while 1:

    # Get letter from user
    print('\n')
    letter = input('Guess a letter: ')

    # Sends letter
    letterBytes = letter.encode('utf-8')
    clientSocket.send(letterBytes)

    #Recieves newWord
    newWordInBytes = clientSocket.recv(1024)
    newWord = newWordInBytes.decode('utf-8')

    for x in newWord:
        print(x, end = " ")
    print(" ")  

    if(newWord == 'arkansas'):
        winGameInBytes = clientSocket.recv(1024)
        winGame = winGameInBytes.decode('utf-8')
        print(winGame)
        clientSocket.close()
        break

    #THIS IS WHERE THE PROBLEM IS   
    loseGame = " "
    loseGameInBytes = clientSocket.recv(1024)   
    loseGame = loseGame.encode('utf-8')

    if(loseGame == "true"):
        print('You have lost the game!')
        clientSocket.close()

【问题讨论】:

    标签: python sockets


    【解决方案1】:

    在我让它工作之前,我遇到了一些问题: 1.注意输入时使用raw_input,否则对我来说崩溃了。 2.您认为服务器存在问题的地方确实存在问题。您不小心关闭了连接,然后在游戏丢失后发送 3.在客户端你有loseGame = loseGame.encode('utf-8')而不是loseGame = loseGameInBytes.encode('utf-8') 4.我将打印语句更改为print(str(x) + " "),,因为您的问题给了我

    这是我修复后的代码。请注意,我在服务器中更改并添加了不必要的中断,它们将导致服务器在单场游戏结束时关闭。

    服务器代码:

    import sys
    
    # Import socket library
    from socket import *
    
    if sys.argv.__len__() != 2:
        serverPort = 5895
    # Get port number from command line
    else:
        serverPort = int(sys.argv[1])
    
    # Choose SOCK_STREAM, which is TCP
    # This is a welcome socket
    serverSocket = socket(AF_INET, SOCK_STREAM)
    
    serverSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    
    # Start listening on specified port
    serverSocket.bind(('', serverPort))
    
    # Listener begins listening
    serverSocket.listen(1)
    
    print("The server is ready to receive")
    
    #Set secret word
    word = 'respecttheplatypus'
    linesForString = ''     
    #Prints out number of letters
    for x in word:
        linesForString += '_'
    
    newWord = 'respecttheplatypus'
    
    # Wait for connection and create a new socket
    # It blocks here waiting for connection
    connectionSocket, addr = serverSocket.accept()
    win = ' '
    #Sends lines of words
    linesInBytes = linesForString.encode('utf-8')
    connectionSocket.send(linesInBytes)
    
    lose = 0
    while 1:
    
    
        l = list(word)
        list2 = list(linesForString)
    
        win = False 
    
        while 1:
    
            while win == False:
                losee = 0
                # Receives Letter
                letter = connectionSocket.recv(1024)
                letterString = letter.decode('utf-8')
    
                for x in range(len(list2)): 
                    if(list2[x] == '_'):
                        if(letterString == l[x]):
                            list2[x] = letterString     
    
                for x in range(len(word)):
                    if(letterString == word[x]):
                        losee = -1
                if (losee != -1):
                    lose += 1
    
                print(lose)
                newWord = "".join(list2)
    
                #Sends newWord
                newWordInBytes = newWord.encode('utf-8')
                connectionSocket.send(newWordInBytes, lose)
    
    
                if(newWord == 'respecttheplatypus'):
                    win = True
                    winGame = 'You have won the game'
                    winGameInBytes = winGame.encode('utf-8')
                    connectionSocket.send(winGameInBytes)
                    connectionSocket.close()
                else:
    
                    if(lose == 7):
                        loseGame = 'true'
                        loseGameInBytes = loseGame.encode('utf-8')
                        print(loseGame)
                        connectionSocket.send(loseGameInBytes)
                        connectionSocket.close()
                        break
                    else: 
                        loseGame = 'false'
                    #THIS IS WHERE THE PROBLEM IS
                        loseGameInBytes = loseGame.encode('utf-8')
                        print(loseGame)
                        connectionSocket.send(loseGameInBytes)  
            break
        break
    

    客户端代码:

    import sys
    
    # Import socket library
    from socket import *
    
    if sys.argv.__len__() != 3:
        serverName = 'localhost'
        serverPort = 5895
    # Get from command line
    else:
        serverName = sys.argv[1]
        serverPort = int(sys.argv[2])
    
    # Choose SOCK_STREAM, which is TCP
    clientSocket = socket(AF_INET, SOCK_STREAM)
    
    # Connect to server using hostname/IP and port
    clientSocket.connect((serverName, serverPort))
    
    #Recieves lines of words
    linesInBytes = clientSocket.recv(1024)
    lines = linesInBytes.decode('utf-8') 
    for x in lines:
        print(str(x) + " "),
    
    while 1:
    
        # Get letter from user
        print('\n')
        letter = raw_input('Guess a letter: ')
    
        # Sends letter
        letterBytes = letter.encode('utf-8')
        clientSocket.send(letterBytes)
    
        #Recieves newWord
        newWordInBytes = clientSocket.recv(len(linesInBytes))
        newWord = newWordInBytes.decode('utf-8')
    
        for x in newWord:
            print(str(x) + " "),
        print(" ")  
    
        if(newWord == 'respecttheplatypus'):
            winGameInBytes = clientSocket.recv(1024)
            winGame = winGameInBytes.decode('utf-8')
            print(winGame)
            clientSocket.close()
            break
    
        #THIS IS WHERE THE PROBLEM IS   
        loseGame = " "
        loseGameInBytes = clientSocket.recv(1024)   
        loseGame = loseGameInBytes.encode('utf-8')
    
        print("lose game is" + str(loseGame))
        if(loseGame == "true"):
            print('You have lost the game!')
            clientSocket.close()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多