Мой if & elif не работает на сокетах (python 3) - PullRequest
0 голосов
/ 15 октября 2019

Я попытался создать сервер, который получает команды от клиента И определить, какую команду написал клиент, я использовал if & elif. Но когда я запускаю программу и пишу команду от клиента, работает только первая команда (командана if) и если я попробую другую команду (от elif & else) Система просто не отвечает (как будто она чего-то ждет)

Код сервера:

import socket
import time
import random as rd


soc = socket.socket()
soc.bind(("127.0.0.1", 7777))

soc.listen(5)
(client_socket, address) = soc.accept()

if(client_socket.recv(4) == b"TIME"):
    client_socket.send(time.ctime().encode())

elif(client_socket.recv(4) == b"NAME"):
    client_socket.send(b"My name is Test Server!")

elif(client_socket.recv(4) == b"RAND"):
    client_socket.send(str(rd.randint(1,10)).encode())

elif(client_socket.recv(4) == b"EXIT"):
    client_socket.close()

else:
    client_socket.send(b"I don't know what your command means")


soc.close()

Код клиента:

import socket

soc = socket.socket()
soc.connect(("127.0.0.1", 7777))

client_command_to_the_server = input("""
These are the options you can request from the server:

TIME --> Get the current time

NAME --> Get the sevrer name

RAND --> Get a Random int

EXIT --> Stop the connect with the server


""").encode()

soc.send(client_command_to_the_server)
print(soc.recv(1024))

soc.close()

1 Ответ

1 голос
/ 15 октября 2019
if(client_socket.recv(4) == b"TIME"):
    client_socket.send(time.ctime().encode())

Это будет проверять первые 4 байта, полученные от сервера

elif(client_socket.recv(4) == b"NAME"):
    client_socket.send(b"My name is Test Server!")

Это будет проверять следующие 4 байта, полученные от сервера. Вопреки тому, что вы предполагаете, он не будет проверять первые байты снова, так как вы вызвали recv, чтобы прочитать больше байтов. Если байтов больше нет (вероятно, поскольку первые 4 байта уже прочитаны), он просто будет ждать. Вместо вызова recv для каждого сравнения вы должны вызвать recv один раз, а затем сравнить результат с различными строками.

Кроме того: recv вернет только до заданное количество байтов. Это может также вернуть меньше.

...