发送使用套接字Python中的字典?(Sending a Dictionary using Sock

2019-07-20 21:44发布

我的问题:好吧,我做了我在哪里基本上使用的插座,以通过网络发送消息的小聊天程序的事情。

它的伟大工程,但是当我决定把它更进了一步,我遇到了一个问题。

我决定把一些加密添加到我是在网络上发送的字符串,所以我继续写道,这样做的脚本。

问题是,显然你不能只送一本字典通过socket,你可能会用一个字符串。

我做了一些研究第一次,我发现这个东西约酱菜。 不幸的是,我无法找到我究竟如何使用他们从有它导出字典文件转换串,放在一边,但我不能这样做,不改变我的计划。

任何人都可以帮助解释我是怎么做到这一点? 我已经无处不在环顾四周,但我似乎无法找出如何。

我上传什么我走到这一步,在这里,如果自带的任何利息给任何人。

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举行)

Answer 1:

你必须序列数据。 会有很多方法可以做到这一点,但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:就足够了。



Answer 2:

您需要先序列化数据。 有几种方法可以做到这一点,最常见的可能是JSON,XML和(蟒蛇特定)泡菜。 或您自己的自定义序列化。

其基本思想是:序列数据,发送它,接受它,再反序列化。



Answer 3:

如果你想用泡菜,你可以使用loadsdumps功能。

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)


Answer 4:

你可以用咸菜和Python远程对象(或焦只),发送完整的对象和数据通过网络(包括互联网)。 举例来说,如果你想发送的对象(字典,列表,类,对象等)使用Python远程对象吧。

这是非常有用的,你想做的事情。

还有在这个环节更多信息http://pythonhosted.org/Pyro4/而这个启动手册是有用的知道你送什么或执行上的网络PC http://pythonhosted.org/Pyro4/intro.html#simple-例

我希望它会帮助你



Answer 5:

使用JSON序列化数据是我喜欢做的方式。 其实我做,不只是为你的库文件: jsonsocket库 。 它会自动为你做的序列化/反序列化。 它还可以有效处理大数据量。



Answer 6:

您还可以使用zmqObjectExchanger( https://github.com/ZdenekM/zmq_object_exchanger )。 它包装咸菜和ZMQ到通过网络传输Python对象。



文章来源: Sending a Dictionary using Sockets in Python?