Duda, instrucción shutdown() - sockets python

Iniciado por painpills, 4 Julio 2021, 19:16 PM

0 Miembros y 1 Visitante están viendo este tema.

painpills

Estuve creando un cliente y servidor, el código que estoy dejando es el del cliente, que se conecta a al servidor y luego se queda a la escucha de una orden, la única a la que responde ahora mismo es a la de tomar un screenshot y enviarla hacia al servidor, al principio el servidor nunca dejaba de recibir información por lo que se quedaba trabado, luego investigando descubrí la instrucción shutdown() que le indicaba al servidor que ya no estaba recibiendo información así podía recibir la imagen e ingresar otra orden. Mi problema es que s.shutdown(socket.SHUT_WR) lo que hace es cerrar uno de los lados de la conexión impidiéndole al cliente enviar información a través del socket así que cuando nuevamente doy la orden de tomar un screenshot el cliente la recibe pero no puede enviar la imagen, saben alguna solución o una forma de "reabrir" el socket para nuevamente enviar información hacia al servidor?



import socket
import pyscreenshot




HOST = 'localhost'
PORT = 4444

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))

print('Conexión establecida')

while True:
orden = s.recv(1024)

if orden == b'screenshot':
#tomo un pantallazo y lo guardo en formato png

img = pyscreenshot.grab()
img.save("captura.png")

#abro la imagen en modo lectura binaria para enviarla

f = open("captura.png", "rb")
imagen = f.read()

while imagen:
s.send(imagen)
imagen = f.read()

# se termina el envio de la imagen

print("Imagen enviada")
s.shutdown(socket.SHUT_WR)
f.close()
del(f)




Dejo también el código del servidor, por si sirve de algo


import socket
import datetime

fechayhora = datetime.datetime.now().strftime('%Y-%m-%d %H-%M-%S')



HOST = 'localhost'
PORT = 4444

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.bind((HOST, PORT))
socket.listen()

print('Servidor a la escucha...')

conn, addr = socket.accept()

print('Conexión entrante de ' + str(addr))

with conn:

while True:
orden = input('Ingresa una orden: ')
orden = orden.lower()

if orden == 'screenshot':
conn.send(b'screenshot')

#recibo la imagen enviada desde el cliente
f = open('capturas\\screenshot_' + str(fechayhora) + '.png', 'wb')
imagen = conn.recv(1024)

while imagen:

f.write(imagen)
imagen = conn.recv(1024)


f.close()
print('Imagen recibida')


elif orden == 'salir':
quit()

engel lex

la intencion original seria no cerrar el socket hasta saber que no lo vas a usa nuevamente

en tal caso de usar shutdown, te toca llamar de nuevo al servidor y abrir una nueva conexion
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.