Я пытаюсь создать клиент-серверную консольную игру, но у меня возникают проблемы с сохранением активности сокета, кажется, он закрывается до того, как я вызвал close()
, и я не могу понять, почему.
Я прочитал тему здесь, но я вызвал connect()
вне цикла while, поскольку логика это уже имело смысл для меня, прежде чем я попытался запустить его, но я все еще получаю сообщение об ошибке из оболочки сервера:
ConnectionAbortedError: [WinError 10053] An established connection was aborted by the software in your host machine
Пока я не получаю сообщение об ошибке в клиентской оболочке, она просто завершает работу сразу после запуска, что также происходит при возникновении ошибки сервера.
После исправления ошибок, отмеченных в комментариях, клиент теперь также показывает ошибку, указывающую, что connected
не определено при попытке запустить цикл while, но должно быть так, поскольку Connect()
запускается до входа в цикл, который должен был установить connected = True
, поэтому цикл должен выполняться, но не выполняется. Я сомневаюсь, что это вообще связано с проблемой сервера, но в чем может быть проблема?
Я поставлю код для обоих ниже:
Клиент
import socket
def GetData():
data = s.recv(1000).decode()
if (data == "closing"):
connected = False
else:
print(data)
def SendData():
tdata = input("")
s.send(data.encode())
def Connect():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 2222))
connected = True
global connected
Connect()
while (connected == True):
GetData()
if (connected == False):
s.close()
break
SendData()
Сервер
import socket
import random
def TheMainGame():
print ("started TheMainGame") # Remove after debug
def within(val, goal):
print ("Runing 'within' function") # Remove after debug
i = abs(val - goal)
if (i <= 5):
return True
else:
return False
def Guess():
print ("Running 'Guess' function") # Remove after debug
while True:
print ("Entered while loop") # Remove after debug
data = "What is your guess?"
c.send(data.encode())
print ("Sent data") # Remove after debug
t = c.recv(1000).decode()
print ("Got data") # Remove after debug
if (t == x):
data = "Correct!"
c.send(data.encode())
data = "closing"
c.send(data.encode())
c.close()
break
elif (within(t,x) == True):
data = "You're close!"
c.send(data.encode())
elif (within(t,x) == False):
data = "Try again"
c.send(data.encode())
else:
data = "There was an error computing the value"
c.send(data.encode())
c.close()
break
x = random.randrange(1, 20, 1)
Guess()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("127.0.0.1", 2222))
s.listen(5)
global data
while True:
(c,a) = s.accept()
print("Received connection from", a) # Remove after debug
data = "Hello %s" %a[0] # Remove after debug
c.send(data.encode()) # Remove after debug
TheMainGame()
Ошибка в оболочке сервера относится к строке 19, поэтому сервер пытается задать вопрос клиенту, что также является второй раз, когда он пытается отправить данные клиенту, но попытка так и не происходит, поэтому я думаю, что сокет закрывается, хотя я никогда не говорил об этом до этого момента, поскольку он даже не смог проверить, t == x
. Что вызывает закрытие сокета?
connected
вConnect()
в своем клиентском коде. Кроме того, если вы собираетесь присвоить значение глобальной переменной, вы должны использовать ключевое словоglobal
с именем переменной в области действия функции. - person Joel Cornett   schedule 31.10.2015connected
глобальным (я отредактирую свой вопрос, чтобы отразить изменение), и теперь я также получаю сообщение об ошибке в клиенте в цикле while, в котором говорится, чтоconnected
не определено, но это должно быть, так как я запустилConnect()
который установит его вTrue
перед входом в цикл... - person PairedPrototype   schedule 31.10.2015