套接字程序Python

时间:2017-10-19 17:47:13

标签: python sockets

我正在制作一个刽子手游戏。我试图发送到服务器,如果输了== 7,然后loseGame = true。而在客户端,如果lostGame是真的,打印出游戏已经丢失。我匹配发送和recv,但它不工作,并继续要求输入猜猜信。你知道我做错了吗?

我认为这就是我认为问题所在的问题所在。

谢谢!

服务器:

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()

1 个答案:

答案 0 :(得分:0)

我遇到的一些问题,直到我能够解决它: 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()