Отправка словаря с использованием сокетов в Python?

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

Он отлично работает, но когда я решил сделать еще один шаг, я столкнулся с проблемой.

проблема в том, что, по-видимому, вы не можете просто отправить словарь через сокеты как вы могли бы с веревочкой.

сначала я сделал некоторые исследования, и я нашел этот материал о соленых огурцах. К сожалению, я не смог узнать, как именно я могу использовать их для преобразования строк, помимо экспорта словаря в файл, но я не могу сделать это без изменения моей программы.

может кто-нибудь помочь объяснить, как я должен это сделать? Я искал везде, но не могу понять, как.

Я загрузил то, что у меня есть до сих пор здесь, если это произойдет какой-либо интерес для кого-либо.

print("ntt Fill out the following fields:")
HOST = input("nNet Send Server Public IP: ")
PORT = int(input("nNet Send Server Port: "))
#------------------------------------------------
#Assessing Validity of Connection
#------------------------------------------------
try:
    s = socket(AF_INET,SOCK_STREAM)
    s.connect((HOST,PORT))
    print("Connected to server:",HOST,)
except IOError:
    print("nnattUndefined Connection Error Encountered")
    input("Press Enter to exit, then restart the script")
    sys.exit()
#-------------------------------------------------
#Now Sending and recieving mesages
#-------------------------------------------------


i = True
while i is True:
    try:
        User_input = input("n Enter your message: ")
    Lower_Case_Conversion = User_input.lower()
    #Tdirectory just stores the translated letters
    Tdirectory = []
    # x is zero so that it translates the first letter first, evidently
    x = 0
    COUNTLIMIT = len(Lower_Case_Conversion)
    while x < COUNTLIMIT:
        for letter in Lower_Case_Conversion[x]:
            if letter in TRvalues:
                Tdirectory += [TRvalues[Lower_Case_Conversion[x]]]
        x = x + 1

        message = input('Send: ')
        s.send(message.encode())
        print("nttAwaiting reply from: ",HOST,)
        reply = s.recv(1024)
        print(HOST,"n : ",reply)
    except IOError:
        print("ntaIOError Detected, connection most likely lost.")
        input("nnPress Enter to exit, then restart the script")

О, и если вам интересно, что такое TRvalues. Это словарь, содержащий переводы для шифрования сообщений.

try:
    TRvalues = {}
    with open(r"C:UsersOwatchDocumentsPythonFunStuffnsed.txt", newline="") as f:
        reader = csv.reader(f, delimiter=" ")
        TRvalues = dict(reader)

(переводы проводятся в a .txt он импортирует)

6 ответов


вы должны сериализовать свои данные. было бы много способов сделать это, но в формате JSON и огурец будет вероятным способом пойти на то, чтобы они были в стандартной библиотеке.

для json:

import json

data_string = json.dumps(data) #data serialized
data_loaded = json.loads(data) #data loaded

Для рассола (или его более быстрого брата cPickle):

import cPickle as pickle

data_string = pickle.dumps(data, -1) 
#data serialized. -1, which is an optional argument, is there to pick best the pickling protocol
data_loaded = pickle.loads(data) #data loaded.

кроме того, Пожалуйста, не пишите

i= True
while i is True:
 #do_something

простой while True: хватило бы.


сначала необходимо сериализовать данные. Существует несколько способов сделать это, наиболее распространенные, вероятно, JSON, XML и (специфичные для python) соленья. Или ваша собственная сериализация.

основная идея: сериализовать ваши данные, отправить его, получить его, десериализовать его снова.


если вы хотите использовать рассол можно использовать loads и dumps функции.

import pickle
a_dict = { x:str(x) for x in range(5) }
serialized_dict = pickle.dumps(a_dict)
# Send it through the socket and on the receiving end:
a_dict = pickle.loads(the_received_string)

вы также можете использовать JSON аналогичным образом. Мне нравится JSON, потому что он читается человеком и не является специфичным для python.

import json
a_dict = { x:str(x) for x in range(5) }
serialized_dict = json.dumps(a_dict)
# Send it through the socket and on the receiving end:
a_dict = json.loads(the_received_string)

вы можете использовать удаленный объект pickle и python (или только pyro), чтобы отправлять полные объекты и данные по сетям (включая интернет). Например, если вы хотите отправить объект (dict, list, class, objects и т. д. ) используйте для этого удаленные объекты python.

Это очень полезно для вас хочу сделать.

есть больше информации в этой ссылке http://pythonhosted.org/Pyro4/ И это руководство стартера может быть полезно знать, что вы отправляете или выполняете на сетевых ПК http://pythonhosted.org/Pyro4/intro.html#simple-example

Я надеюсь, что это поможет вам


использование JSON для сериализации ваших данных-это то, как я предпочитаю это делать. На самом деле я сделал библиотеку, которая делает именно это для вас: библиотека jsonsocket. Он будет выполнять сериализацию/десериализацию автоматически для вас. Он также эффективно обрабатывает большие объемы данных.


вы также можете использовать zmqObjectExchanger (https://github.com/ZdenekM/zmq_object_exchanger). Он обертывает рассол и zmq для передачи объектов python по сети.