Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sending a Dictionary using Sockets in Python?

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)

like image 294
Micrified Avatar asked Mar 03 '13 20:03

Micrified


People also ask

How do I bind a socket to a port in Python?

The bind() method of Python's socket class assigns an IP address and a port number to a socket instance. The bind() method is used when a socket needs to be made a server socket. As server programs listen on published ports, it is required that a port and the IP address to be assigned explicitly to a server socket.

Can a socket send and receive at the same time Python?

You can send and receive on the same socket at the same time (via multiple threads). But the send and receive may not actually occur simultaneously, since one operation may block the other from starting until it's done.


1 Answers

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.

like image 101
thkang Avatar answered Oct 07 '22 08:10

thkang