Python Сокеты: отправьте данные, затем получите ответ и, наконец, отправьте подтверждение - PullRequest
0 голосов
/ 30 марта 2020

Я не уверен, разрешено ли это, но я бы хотел, чтобы клиент отправил уведомление, получил ответ и, наконец, отправил обратно окончательное сообщение проверки. Первая отправка и получение, кажется, работают нормально, но окончательная .sendall (), похоже, не отправляет на сервер.

Клиент:

import threading
import time
import socket
import sys

alarm_on = False   # Flag to stop the thread

# The thread function
def beep():
    while alarm_on:
        print("BEEP BEEP BEEP")
        time.sleep(20)



try:
    mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
    print("Failed to create Movement Socket")

mysock.connect(('1.1.1.1',1234))
try:
    mysock.sendall(b'MOVEMENT')
except socket.error:
    print("Failed to send")
    sys.exit()
#Recieve command to turn ignore, turn on alarm, or turn off alarm
try:
    command = mysock.recv(10000)
    print(command)
except socket.error:
    print("Error receiving data")
    sys.exit()
print("Command is: " + str(command))
#Turn on command
if command == b'ON':
    state = command
    alarm_on = True
    # Start the thread
    thrd1 = threading.Thread(target=beep).start()
    mysock.sendall(state) # ********Final Validation to server of state
#Ignore the movement for 30 min
elif command == b'NO':
    state = b'Silent for 15 min'
    print(state)
    mysock.sendall(state) # ********Final Validation to server of state
    time.sleep(900)

Сервер

import socket
import sys

try:
    mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
    print("Failed to create socket")
    sys.exit

try:
    mysock.bind(("",1234))
except:
    print("Failed to bind")

mysock.listen(5)
while True:
    validation = False
    conn,addr = mysock.accept()
    data = conn.recv(1000)
    print("Data recieved: " + str(data))
    if data == b'MOVEMENT':
        while not validation:
            command = input("Movement detected, type ON enable Alarm or NO to ignore: ")
            command = command.upper()
            if command == "ON" :
                message = command 
                validation = True
            elif command == "NO":
                message = command
                validation = True
    else:
        print("Data is: " + str(data) + "is not a valid input")
        sys.exit()    

    try:
        conn.sendall(bytes(message.encode()))
    except:
        print("Failed to send")
        sys.exit()
    conn.close()
mysock.close()

Можно ли выполнить окончательную отправку после первоначальной отправки и получения? Если так, почему мой последний sendall не работает?

1 Ответ

1 голос
/ 30 марта 2020

Чтобы получить второе сообщение, необходимо установить второе .recv (), чтобы перехватить «сообщение проверки». Я добавил следующую строку в код сервера:

validation = conn.recv(1000)
print(validation)

Полный код сервера:

import socket
import sys

try:
    mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
    print("Failed to create socket")
    sys.exit

try:
    mysock.bind(("",1234))
except:
    print("Failed to bind")

mysock.listen(5)
while True:
    validation = False
    conn,addr = mysock.accept()
    data = conn.recv(1000)
    print("Data recieved: " + str(data))
    if data == b'MOVEMENT':
        while not validation:
            command = input("Movement detected, type ON enable Alarm or NO to ignore: ")
            command = command.upper()
            if command == "ON" :
                message = command 
                validation = True
            elif command == "NO":
                message = command
                validation = True
    else:
        print("Data is: " + str(data) + "is not a valid input")
        sys.exit()    

    try:
        conn.sendall(bytes(message.encode()))
    except:
        print("Failed to send")
        sys.exit()
    validation = conn.recv(1000)
    print(validation)
    conn.close()
mysock.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...