Sending a Dictionary using Sockets in Python?
dictionary, python, sockets, translation
Solution
You have to serialize your data. there would be many ways to do it, but json and pickle will be the likely way to go for they being in standard library.
for json :
import json
data_string = json.dumps(data) #data serialized
data_loaded = json.loads(data) #data loaded
for pickle(or its faster sibling 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.
also, please don't write
i= True
while i is True:
#do_something
because simple `while True:` would suffice.
Problem
My problem: Ok, I made a little chat program thing where I am basically using sockets in order to send messages over a network. It works great, but when I decided to take it a step further, I ran into a problem. I decided to add some encryption to the strings I was sending over the network, and so I went ahead and wrote the script that did that. The problem is that apparently you can't just send a dictionary through sockets as you might with a string. I did some research first, and I found this stuff about Pickles. Unfortunately, I couldn't find out exactly how I could use them to convert strings, aside from having it exporting the dictionary to a file, but I can't do that without changing my program. Can anyone help explain how I am to do this? I've looked around everywhere but I can't seem to find out how. I've uploaded what I've got so far here, if that comes of any interest to anybody. ``` 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") ``` Oh, and if your wondering what TRvalues is. It's the dictionary that contains the 'translations' for encrypting simple messages. ``` try: TRvalues = {} with open(r"C:\Users\Owatch\Documents\Python\FunStuff\nsed.txt", newline="") as f: reader = csv.reader(f, delimiter=" ") TRvalues = dict(reader) ``` (The translations are held in a .txt it imports)