9

私の問題: ネットワーク経由でメッセージを送信するために、基本的にソケットを使用する小さなチャット プログラムを作成しました。

うまく機能しますが、さらに一歩進めることにしたとき、問題が発生しました。

ネットワーク経由で送信する文字列に暗号化を追加することにしたので、先に進み、それを行うスクリプトを作成しました。

問題は、文字列の場合とは異なり、ソケットを介して辞書を送信することは明らかにできないことです。

私は最初にいくつかの調査を行い、ピクルスについてこのようなものを見つけました. 残念ながら、辞書をファイルにエクスポートする以外に、それらを使用して文字列を変換する方法を正確に見つけることができませんでしたが、プログラムを変更せずにそれを行うことはできません.

私がこれを行う方法を説明できる人はいますか? 私はあちこちを見回しましたが、方法を見つけることができないようです。

私がこれまでに得たものをここにアップロードしました。

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 に保持されます)

4

6 に答える 6

21

データをシリアル化する必要があります。それを行うには多くの方法がありますが、jsonpickleは、標準ライブラリにあるため、実行する可能性が高い方法です。

json の場合:

import json

data_string = json.dumps(data) #data serialized
data_loaded = json.loads(data) #data loaded

pickle (またはその高速な兄弟である 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:でいいから。

于 2013-03-03T20:37:09.517 に答える
3

最初にデータをシリアル化する必要があります。これを行うにはいくつかの方法がありますが、おそらく最も一般的なのは、JSON、XML、および (python 固有の) pickle です。または、独自のカスタム シリアライゼーション。

基本的な考え方は、データをシリアル化し、送信し、受信し、再びシリアル化解除することです。

于 2013-03-03T20:19:40.040 に答える
2

JSON を使用してデータをシリアル化する方法は、私が好む方法です。私は実際にあなたのためにそれを行うライブラリを作成しました: jsonsocket ライブラリ。シリアライゼーション/デシリアライゼーションが自動的に行われます。また、大量のデータを効率的に処理します。

于 2014-05-01T06:06:19.447 に答える
2

pickle と python リモート オブジェクト (または pyro のみ) を使用して、ネットワーク (インターネットを含む) 経由で完全なオブジェクトとデータを送信できます。たとえば、送信オブジェクト (dict、list、class、objects など) が必要な場合は、python リモート オブジェクトを使用します。

したい方にとても便利です。

このリンクに詳細情報がありますhttp://pythonhosted.org/Pyro4/ そして、このスターターマニュアルは、ネットワークPCで何を送信または実行するかを知るのに役立ちますhttp://pythonhosted.org/Pyro4/intro.html#simple-例

お役に立てば幸いです

于 2013-03-03T22:27:56.950 に答える
2

pickle を使用したい場合は、 関数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 は人間が読める形式であり、Python 固有のものではないため、私は 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)
于 2013-03-03T20:33:46.873 に答える