json.decoder.JSONDecode Error: Valor esperado: línea 1 columna 1 (char 0) socket python
Estoy tratando de hacer un pequeño programa que necesita dos clientes y un servidor. Básicamente quiero enviar a JSON del cliente 1 al cliente 2, (que cliente 1 ha recibido del servidor), pero no funciona. Del cliente 1 al servidor funciona sin embargo. Uso una nueva conexión de socket para enviar del cliente 1 al cliente 2 (esto es obligatorio para mi asignación). Tengo estos errores:
File "C:\Users\duser\OneDrive\Bureaublad\clientt.py", line 105, in
client2()
File "C:\Users\duser\OneDrive\Bureaublad\clientt.py", line 75, in client2
newdict = json.loads(receiveclient1)
File "C:\Users\duser\AppData\Local\Programs\Python\Python38\lib\json\__init__.py", line 357, in loads
return _default_decoder.decode(s)
File "C:\Users\duser\AppData\Local\Programs\Python\Python38\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Users\duser\AppData\Local\Programs\Python\Python38\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Aquí está el código:
import socket
import json
import sys
i = 0
host = "xxx.xx.xxx.xxx"
port = 55550
port2 = 44445
obj = socket.socket()
s = socket.socket()
hostname = socket.gethostname()
complete_info = ''
clientinfo = {"studentnr1": "0982130",
"studentnr2": "0943260",
"classname": "INF",
"clientid": 1,
"teamname":"Team",
"ip":socket.gethostbyname(hostname),
"secret": "",
"status": ""}
def client1():
global complete_info, newdict
obj.connect((host,port))
while True:
data = obj.recv(1024)
if len(data) == 0:
break
complete_info = data.decode("utf-8")
print(complete_info)
clientinfosend = str.encode(json.dumps(clientinfo))
obj.sendall(clientinfosend)
inforeceive = obj.recv(1024).decode("utf-8")
inforeceived = json.loads(inforeceive)
print(inforeceived)
s.connect((socket.gethostbyname(hostname),port2))
s.sendall(str.encode(json.dumps(inforeceived)))
obj.close()
print("Connection closed")
def client2():
#while loop which listens to connection from client 1
s.bind((socket.gethostbyname(hostname), port2))
s.listen()
conn, addr = s.accept()
print("Listening for connections")
while True:
print('Connection from', addr)
data = conn.recv(1024).decode("utf-8")
if not data:
break
receiveclient1 = conn.recv(1024).decode("utf-8")
newdict = json.loads(receiveclient1)
print(newdict)
temp = newdict["studentnr1"]
newdict["studentnr1"] = newdict["studentnr2"]
newdict["studentnr2"] = temp
newdict["clientid"] = sys.argv[1]
s.close()
num_arguments = len(sys.argv[1:])
i = 1
args = sys.argv[1:]
if int(sys.argv[i]) == 1:
client1()
elif int(sys.argv[i]) == 2:
client2()
Pregunta hecha hace 3 años, 4 meses, 29 días - Por phpphoenix
3 Respuestas:
-
En el cliente2, primero lee la toma hasta que se cierra o se cierra con:
while True: print('Connection from', addr) data = conn.recv(1024).decode("utf-8") if not data: break
Eso significa que cuando salgas de ese bucle, no hay datos que puedan venir desde el socket.
Así que en las siguientes líneas:
receiveclient1 = conn.recv(1024).decode("utf-8") newdict = json.loads(receiveclient1)
receiveclient1
es una cadena vacía, que explica el error.Deberías construir
receiveclient1
de ladata
fragmentos:receiveclient1 = '' while True: print('Connection from', addr) data = conn.recv(1024).decode("utf-8") if not data: break receiveclient1 += data newdict = json.loads(receiveclient1)
Respondida el Dec 18, 2020 a las 12:54 - por algorithmwizard
Votos positivos: 0 | Votos negativos: 0 -
El error
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
indica que hay un problema al intentar decodificar el JSON en la líneanewdict = json.loads(receiveclient1)
en la funciónclient2
.El problema probablemente se debe a que estás intentando recibir datos del cliente 1 dos veces consecutivas en las líneas:
python receiveclient1 = conn.recv(1024).decode("utf-8") newdict = json.loads(receiveclient1)
La primera línea
receiveclient1 = conn.recv(1024).decode("utf-8")
ya recibe y decodifica los datos del cliente 1, por lo tanto, no es necesario realizar esta operación nuevamente. Puedes eliminar la primera línea y trabajar directamente con los datos recibidos endata
.Por lo tanto, debes modificar esa sección de tu código de la siguiente manera:
python data = conn.recv(1024).decode("utf-8") newdict = json.loads(data)
Con esta modificación, deberías poder decodificar correctamente los datos del cliente 1 en el cliente 2.
¡Espero que esta solución te sea de ayuda! Si tienes alguna otra pregunta o duda, ¡no dudes en decírmelo!
Respondida el Dec 19, 2020 a las 12:53 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El error que estás experimentando, "json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)", indica que el decodificador JSON no puede interpretar la cadena recibida como un objeto JSON válido. Esto puede suceder por varias razones:
- Cadena JSON no válida: La cadena que estás intentando decodificar puede no ser una cadena JSON válida, lo que significa que no cumple con la sintaxis y la estructura requeridas por el formato JSON.
- Codificación incorrecta: La cadena puede estar codificada incorrectamente, lo que dificulta que el decodificador JSON la interprete correctamente.
Para depurar este problema, puedes intentar lo siguiente:
- Verifica la cadena JSON: Imprime la cadena JSON que estás intentando decodificar y verifica si es válida. Puedes usar un validador JSON en línea o una herramienta como `json.tool` para verificar su validez.
- Verifica la codificación: Asegúrate de que la cadena se decodifique utilizando la codificación correcta. En tu código, estás decodificando la cadena como UTF-8, pero es posible que la cadena esté codificada en una codificación diferente.
- Captura la excepción: En lugar de dejar que el error interrumpa tu programa, puedes capturarlo y manejarlo para obtener más información. Esto te permitirá imprimir el mensaje de error y ver qué parte de la cadena está causando el problema.
Aquí tienes un código modificado que captura la excepción JSONDecodeError y proporciona un mensaje de error más informativo:
import socket import json import sys i = 0 host = "xxx.xx.xxx.xxx" port = 55550 port2 = 44445 obj = socket.socket() s = socket.socket() hostname = socket.gethostname() complete_info = '' clientinfo = {"studentnr1": "0982130", "studentnr2": "0943260", "classname": "INF", "clientid": 1, "teamname":"Team", "ip":socket.gethostbyname(hostname), "secret": "", "status": ""} def client1(): global complete_info, newdict obj.connect((host,port)) while True: data = obj.recv(1024) if len(data) == 0: break complete_info = data.decode("utf-8") print(complete_info) clientinfosend = str.encode(json.dumps(clientinfo)) obj.sendall(clientinfosend) inforeceive = obj.recv(1024).decode("utf-8") inforeceived = json.loads(inforeceive) print(inforeceived) s.connect((socket.gethostbyname(hostname),port2)) s.sendall(str.encode(json.dumps(inforeceived))) obj.close() print("Connection closed") def client2():
while loop which listens to connection from client 1
s.bind((socket.gethostbyname(hostname), port2)) s.listen() conn, addr = s.accept() print("Listening for connections") while True: print('Connection from', addr) data = conn.recv(1024).decode("utf-8") if not data: break receiveclient1 = conn.recv(1024).decode("utf-8") try: newdict = json.loads(receiveclient1) print(newdict) temp = newdict["studentnr1"] newdict["studentnr1"] = newdict["studentnr2"] newdict["studentnr2"] = temp newdict["clientid"] = sys.argv[1] except json.decoder.JSONDecodeError as e: print(f"Error decoding JSON: {e}") s.close() num_arguments = len(sys.argv[1:]) i = 1 args = sys.argv[1:] if int(sys.argv[i]) == 1: client1() elif int(sys.argv[i]) == 2: client2()Al ejecutar este código, obtendrás un mensaje de error más informativo que te ayudará a identificar la causa del problema.
Respondida el Dec 19, 2020 a las 13:03 - por Gemini
Votos positivos: 0 | Votos negativos: 0