отправка json.dumps () через python-сокеты - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь создать набор серверных и клиентских скриптов;серверный скрипт запрашивает необработанный ввод у пользователя, сохраняет его в словаре и преобразует его в json с помощью функции json.dumps().Преобразованный словарь затем сохраняется в переменной jasonFile, которая затем отправляется клиенту.Словарь json работает, но я борюсь с сетевой стороной вещей.

Вот мой код сервера:

def Main():
host = '0.0.0.0'
port = 5000
s.bind((host, port))
s.listen(5)

print "Server Started"


while True:
    addr = s.accept()
    print "Client Connected from IP: " + str(addr)
    serverMessage = "Connection Established: Would you like to download the Json dictionary?"
    s.send(serverMessage)
    clientReply = s.recv(1024)
    if clientReply in ['Y', 'y', 'Yes', 'yes', 'YES']:
        s.send(jasonFile)
        s.close()
    else:
        print "Connection from " + addr + " closed!"
        s.send("Connection Error!")
        s.close()

А вот мой код клиента:

def Main():
    host = raw_input("Please enter the server IP you wish to connect to: ")
    port = 5000

    #define client to use socket module to connect via IPV4 and TCP only
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect((host, port))

    serverMessage = client.recv(1024)
    print serverMessage

    clientReply = raw_input("Type 'Yes' To download dictionary")
    if clientReply in ['Y', 'Yes', 'y', 'yes', 'YES']:
            client.send(clientReply)
            jasonRecv = client.recv(1024)
            print jasonRecv
    else:
            client.close()
            print "Disconnected from server!"

Я еще не дошел до преобразования данных json обратно в строку на клиенте, потому что сервер выдает мне ошибку, когда клиент пытается подключиться.

Сообщение об ошибке, которое я получаю отIDLE:

Server Started
Client Connected from IP: (<socket._socketobject object at 0x000000000401E048>, ('127.0.0.1', 34375))

Traceback (most recent call last): File "D:/Server.py", line 105, in <module>
Main()

File "D:/Server.py", line 94, in Main
s.send(serverMessage)

error: [Errno 10057] A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied

Я думал, что определяю адрес для отправки данных в переменную addr, но, очевидно, нет?

1 Ответ

0 голосов
/ 25 октября 2018

Попробуйте:

conn, addr = s.accept()
...
conn.send(serverMessage)

т.е. замените s. вызовы на conn., что представляет собой принятое соединение сокета от клиента.

Из API сокета Python :

socket.accept ()

Принять соединение.Сокет должен быть привязан к адресу и прослушивать соединения.Возвращаемое значение - это пара (conn, address), где conn - это новый объект сокета, используемый для отправки и получения данных о соединении, а address - это адрес, связанный с сокетом на другом конце соединения.

Примеры приведены в конце страницы.

Также см. Руководство по программированию сокетов Python

...