6

Вопрос по translation, sockets, dictionary, python – Отправлять словарь с помощью сокетов в Python?

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

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

Я решил добавить некоторое шифрование к строкам, которые я посылал по сети, и поэтому я решил написать сценарий, который это сделал.

Проблема в том, что, видимо, вы можетепросто отправьте словарь через сокеты, как вы можете с помощью строки.

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

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

выложил что яУ нас так далеко, если это кому-нибудь интересно.

print("\n\t\t 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("\n\n\a\t\tUndefined 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("\n\t\tAwaiting reply from: ",HOST,)
        reply = s.recv(1024)
        print(HOST,"\n : ",reply)
    except IOError:
        print("\n\t\aIOError Detected, connection most likely lost.")
        input("\n\nPress Enter to exit, then restart the script")

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

try:
    TRvalues = {}
    with open(r"C:\Users\Owatch\Documents\Python\FunStuff\nsed.txt", newline="") as f:
        reader = csv.reader(f, delimiter=" ")
        TRvalues = dict(reader)

(Переводы хранятся в формате .txt, который он импортирует)

<span>Pickle - это приличный способ сериализации, но вы не должныt использовать его (по соображениям безопасности и совместимости). Вместо этого используйте JSON.</span>

Mar 03, 2013, 8:40 PMотTom van der Woerdt

6ответов

16

Вы должны сериализовать свои данные. было бы много способов сделать это, но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: было бы достаточно.

1

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

1

Вы можете использовать Pickle и Python Remote Object (или только Pyro) для отправки полных объектов и данных по сети (включая Интернет). Например, если вы хотите отправить объект (dict, список, класс, объекты и т. Д.), Используйте для него удаленные объекты Python.

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

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

Надеюсь это тебе поможет

1

Если вы хотите использовать рассол, вы можете использовать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, потому что он читается человеком и нет питон конкретно.

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)
0

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

3

Вы должны сначала сериализовать ваши данные. Есть несколько способов сделать это, наиболее распространенные, вероятно, JSON, XML и (специфичные для Python) соленья. Или ваша собственная пользовательская сериализация.

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

RelatedQuestions