【问题标题】:Socket Program in Python LoopingPython循环中的套接字程序
【发布时间】:2017-10-17 15:21:19
【问题描述】:

我想做的是从客户端获取一封信,将其发送到服务器,让服务器进行一些更改并将其发回。然后我希望客户端显示它。但我很难把它变成一个循环。我希望它不断地请求一封信,直到 win 等于 true。我怎样才能做到这一点?我尝试在服务器端添加一个 while 循环,但收到有关文件描述符错误的错误。谢谢!

客户:

import sys
from socket import *

if sys.argv.__len__() != 3:
  serverName = 'localhost'
  serverPort = 5555
else:
  serverName = sys.argv[1]
  serverPort = int(sys.argv[2])

clientSocket = socket(AF_INET, SOCK_STREAM)


clientSocket.connect((serverName, serverPort))



# Get letter from user
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')
print(newWord)

clientSocket.close()

服务器:

     import sys

from socket import *

if sys.argv.__len__() != 2:
    serverPort = 5555
else:
    serverPort = int(sys.argv[1])

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


serverSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)


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 += '_ '


while 1:
    # 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)

    while 1:

        # Receives Letter
        letter = connectionSocket.recv(1024)
        letterString = letter.decode('utf-8')

        win = False 
        while win == False:
            newWord = ' '

            for x in word:
                 if(letterString == x):
                     newWord += x       
                 else:
                     newWord += '_ '

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

            if(newWord == 'Arkansas'):
                win = True
                print('You have won the game')
            else: 
                win = False
        # Close connection to client but do not close welcome socket
        connectionSocket.close()

【问题讨论】:

  • 您没有展示我们可以测试的完整示例。
  • @Adirio 我刚刚添加了我所有的代码!谢谢!
  • 您正试图向他发送` _ _ _ _ _ _ _ _ `,但客户端没有收听。然后客户端正在发送一个字母,服务器正在接收和解码它,并形成一个缺少字母的新单词,客户端正在接收和打印,然后关闭连接。同时,服务器将新单词重新生成为内部while 没有中断并尝试在关闭的连接上再次发送它,从而给您该错误。你无法知道他猜到了哪些字母,你在客户端没有循环,你不听客户端的初始空词。
  • @Adirio 我对 python 套接字编程完全陌生,所以你能否指出我如何解决它的正确方向?我无法理解客户端和服务器之间的同步。我应该把循环放在客户端的哪里?
  • 我想如果你用你的用例做这样的事情你可能会明白:upload.wikimedia.org/wikipedia/commons/thumb/9/9b/…

标签: python sockets


【解决方案1】:

此序列图可以帮助您构建应用。试着根据图表修改你的程序,告诉我们你发现了什么问题。

【讨论】: