1

私はpythonが初めてで、tcp接続でソケットを使用してファイルを送信する方法を理解しようとするのが本当に難しいと感じています。別の質問でこのコードを見つけました。

クライアント側

def _sendFile(self, path):
    sendfile = open(path, 'rb')
    data = sendfile.read()

    self._con.sendall(encode_length(len(data))) # Send the length as a fixed size message
    self._con.sendall(data)


    # Get Acknowledgement
    self._con.recv(1) # Just 1 byte

サーバ側

def _recieveFile(self, path):
    LENGTH_SIZE = 4 # length is a 4 byte int.
    # Recieve the file from the client
    writefile = open(path, 'wb')
    length = decode_length(self.con.read(LENGTH_SIZE) # Read a fixed length integer, 2 or 4 bytes
    while (length):
        rec = self.con.recv(min(1024, length))
        writefile.write(rec)
        length -= sizeof(rec)

    self.con.send(b'A') # single character A to prevent issues with buffering

今、私はこのコードで2つの問題を抱えています

self._con.sendall(encode_length(len(data)))

この行では、encode_length is undefined というエラーが表示されます

第二に、これらはファイルを送受信する関数ですどこでそれらを呼び出しますか最初にTCP接続を形成してからこれらの関数を呼び出しますそしてそれらを正確に呼び出す方法、それらを直接呼び出すと、クライアント側で_sendFile(self 、パス) は 2 つの引数を取ります (パスだけで自分自身を渡していないため)

第三に、OSライブラリの関数を使用して完全なパスを取得しているので、次のような関数を呼び出しています

_sendFile(os.path.abspath("file_1.txt"))

これは引数を渡す正しい方法ですか

申し訳ありませんが、この質問はかなり基本的で不自由ですが、オンラインのどこでも基本的に機能を取得できますが、それを呼び出す方法はわかりません

今、これは私が関数を呼び出す方法です

serverIP = '192.168.0.102'
serverPort = 21000

clientSocket = socket(AF_INET, SOCK_STREAM)

message = "Want to Backup a Directory"


clientSocket.connect((serverIP, serverPort))

_sendFile(os.path.abspath("file_1.txt"))

根本的に間違っているのはどれか

クライアントとサーバーの両方に同じコンピューターを使用しています

ターミナルを使用して Ubuntu で Python を実行する

4

1 に答える 1

3

最初の問題:

これは、単に functions を定義していないためですencode/decode_lenght


2番目の問題:

あなたの機能は次のとおりdef _sendFile(self, path): ...です。
の使い方を知っていますselfか?授業で使用しています。したがって、なしselfで定義するか、クラスを使用します。

例:

from socket import *
class Client(object):

    def __init__(self):

        self.clientSocket = socket(AF_INET, SOCK_STREAM)

    def connect(self, addr):

        self.clientSocket.connect(addr)

    def _sendFile(self, path):

        sendfile = open(path, 'rb')
        data = sendfile.read()

        self._con.sendall(encode_length(len(data))) # Send the length as a fixed size message
        self._con.sendall(data)


        # Get Acknowledgement
        self._con.recv(1) # Just 1 byte

>>> client = Client()
>>> client.connect(("192.168.0.102", 21000))
>>> client._sendFile(os.path.abspath("file_1.txt")) # If this file is in your current directory, you may just use "file_1.txt"

についても(ほぼ)同じですServer


これらの関数をどこで定義しますか? コルセのコーデに!あなたの機能は何をすべきですか?
OK、例:

def encode_length(l):

    #Make it 4 bytes long
    l = str(l)
    while len(l) < 4:
        l = "0"+l 
    return l

# Example of using
>>> encode_length(4)
'0004'
>>> encode_length(44)
'0044'
>>> encode_length(444)
'0444'
>>> encode_length(4444)
'4444'

自己について:

ちょっとだけ:

self現在のオブジェクトにリダイレクトします。例:

class someclass:
    def __init__(self):
        self.var = 10
    def get(self):
        return self.var

>>> c = someclass()
>>> c.get()
10
>>> c.var = 20
>>> c.get()
20
>>> someclass.get(c)
20
>>>

どのように機能しsomeclass.get(c)ますか?の実行中someclass.get(c)の新しいインスタンスは作成されませんsomeclass。インスタンス.get()から呼び出すと、自動的にインスタンス オブジェクトに設定されます。したがって== を実行しようとすると、が定義されていないため、エラーが発生します。 someclassselfsomeclass.get(c)c.get()someclass.get()selfTypeError: unbound method get() must be called with someclass instance as first argument (got nothing instead)


デコレーターを使用して、クラスの関数を呼び出すことができます (インスタンスではありません!):

class someclass:
    def __init__(self):
        self.var = 10
    def get(self):
        return 10 # Raises an error
    @classmethod
    def get2(self):
        return 10 # Returns 10!

説明が下手で申し訳ありません、私の英語は完璧ではありません


ここにいくつかのリンクがあります:

サーバー.py

client.py

于 2013-10-16T19:32:58.353 に答える