使用Socket在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。它是包含用于加密简单消息的“翻译”的字典。

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


问题答案:

您必须序列化数据。有很多方法可以做到这一点,但是jsonpickle可能会成为标准库中的对象。

对于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:就足够了。