【问题标题】:Python socket server/client not loopingPython套接字服务器/客户端不循环
【发布时间】:2014-10-31 17:56:06
【问题描述】:

我正在开发一个通过套接字连接的两个客户端处理的猜数游戏,但由于某种原因,在初始循环之后它停止工作并且不发送/接收任何内容。代码第一次运行良好,但无论我更改什么,第二次我要么在服务器文件中的guessNumber = int(s.recv(4096).decode() 行收到错误 - 它报告尝试将'' 更改为错误诠释。这意味着它没有接收到值(在这些情况下,客户端程序也没有接收到"What is your guess? " 字符串)。 然而,下面的代码在初始循环之后没有做任何事情,如果你猜到第一个循环上的数字,那么它工作正常,你的分数被写入一个文件,它们都按应有的方式结束。

但如果你不这样做,那么它也不会做任何事情,所以任何帮助都将不胜感激。它使用 IDLE IDE 在 Python 3.4.2 中运行。

服务器:

import socket
import random

l = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

score = 0
guessNumber = 0

def within(value, goal, n):
    numDifference = abs(value - goal)
    if (numDifference <= n):
        return True
    else:
        return False

scoreFile = open('scores', 'a')
randomNumber = random.randrange(0, 11)

l.bind(("127.0.0.1", 4001)) 
l.listen(5) 
print("Waiting...")

while True:
    (s,ca)=l.accept()   
    print("Connection from", ca)

    while (not(within(guessNumber, randomNumber, 0))):
        s.sendall("What is your guess? ".encode())
        guessNumber = int(s.recv(4096).decode())
        score += 1

        print ("%d" % guessNumber)

        if (within(guessNumber, randomNumber, 0)):
            s.sendall(("You guessed correctly! \n Your score is %d" % score).encode())
            scoreFile.write("Player %s has a score of %d \n" % (ca, score))
            scoreFile.close()
            s.sendall("1".encode())
        elif (within(guessNumber, randomNumber, 3)):
            s.sendall("You are getting close!".encode())
            s.sendall("0".encode())
        else:
            s.sendall("You are way off".encode())
            s.sendall("0".encode())

    s.close()  

客户:

import socket

gameOver = False
guessNumber = 0

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 4001))

while (gameOver != "1"):
    #Send guess
    guessNumber = input(s.recv(4096).decode()) 
    s.sendall(guessNumber.encode())

    #Recieve result
    print(s.recv(4096).decode())

    #Check whether game is over or not
    gameOver = s.recv(4096).decode()

print ("Game Over")
s.close()   

【问题讨论】:

  • 我尝试通过 Visual Studio 2013 运行它们,它现在将运行 2~3 次迭代,然后再次在同一点停止工作。我已经确定它正在运行代码以将提示从服务器发送到客户端,但是客户端没有收到它,因此没有发送结果,导致服务器和客户端陷入僵局

标签: python python-sockets


【解决方案1】:

事实证明客户端在第一次迭代后关闭了它的套接字,因为它以接收结束。我在每次接收后添加了一些发送确认,以告诉服务器它已成功执行,现在一切正常!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-11
    • 2014-11-05
    • 2013-09-29
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    相关资源
    最近更新 更多