2

私は Python を初めて使用するので、基本的な質問があります。ネットワーク ソケット接続のクライアント側でデータを受信できますか? 私の質問では、クライアントは接続を開始する人です。これはおそらく明らかですが、明確にしたかったのです。サーバーがクライアントからファイルを受信できるようにする別のサーバーとクライアント(両方ともPython)があるため、私は尋ねます。完全に機能しますが、クライアントがファイルを受信する例を取得できません。Python は、パイプが壊れていると私に言い続けます。クライアント側で行を使用しているためと思われますdata = mysocket.recv(1024)。私の疑いは、クライアントがデータの流れを見ていないため、サーバーへの接続を閉じているということです。サーバーはそれを壊れたパイプと見なします。サーバーとクライアントは以下です。

サーバ:

 #libraries to import
 import socket
 import os
 import sys
 import M2Crypto as m2c

 #information about the server the size of the message being transferred
 server_address = '10.1.1.2'
 key_port = 8888
 max_transfer_block = 1024

 FILE = open("sPub.pem","r")

 #socket for public key transfer
 keysocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM)
 keysocket.bind((server_address, key_port))
 keysocket.listen(1)

 while 1:
         conn, client_addr = keysocket.accept()
         print 'connected by', client_addr
         #sends data to the client
         data = FILE.read()
         keysocket.sendall(data)
 keysocket.close()

クライアント:

 # the specified libraries
 import socket
 import M2Crypto as m2c
 #file to be transferred
 FILE = open("test.txt", "r")
 #address of the server
 server_addr = '10.1.1.2'
 #port the server is listening on
 dest_port = 8888

 data = FILE.read()


 #Creates a socket for the transfer
 mysocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM)
 mysocket.connect( (server_addr, dest_port) )

 data = mysocket.recv(1024)
 print data
 #creates a new file to store the msg
 name = "serverPubKey.pem"

 #opens the new file and writes the msg to it
 FILE = open (name, "w")
 FILE.write(data)


 #closes the socket.
 mysocket.close()

この問題について何か助けていただければ幸いです。ありがとう!

4

2 に答える 2

1

このようなアプリケーションでは、低レベルの詳細をバイパスし、代わりに高レベル API でsocket.makefileを使用すると役立つ場合があります。

クライアントのクローズで、以下を置き換えます。

data = mysocket.recv(1024)

と:

f = mysocket.makefile('rb')
data = f.read(1024)           # or any other file method call you need

ftplibのソース コードは、製品コードでこれを行う方法を示しています。

于 2011-10-30T00:52:15.447 に答える
0

また、前のコメントに追加すると、受信を数回繰り返すことが良いテストになる場合があります。サーバーが送信する情報を 1 回のパスでキャッチできる可能性はほとんどありません。

このようなもの

nreceive = True#nreceive = Not Received
ticks = 0
f = None
while nreceive and ticks < 101:#try to get the info 100 times or until it's received
    ticks+=1
    try:
        f = mysocket.makefile('rb')
        if not f == None:
            nreceive = False
    except:
        pass
data = f.read(1024)
于 2011-10-30T01:13:20.087 に答える