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, 5 meses, 4 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 la data 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ínea newdict = json.loads(receiveclient1) en la función client2.

    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 en data.

    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