2016-12-22 28 views
-1

こんにちは、stackoverflowコミュニティ 私は単純なソケットベースのPythonスクリプトを書いて〜20回実行しました。 18回はそれがやろうとしたことをしましたが、2回は無駄な手紙を印刷しました。同じpythonスクリプトですが、異なる結果

(これは、特定のディレクトリ内のすべてのフォルダ名を送信して印刷することになった)

サーバー:

import socket 
import os 
import base64 

host = '' 
port = 6934 

s = socket.socket() 

s.bind((host, port)) 

s.listen(5) 

while True: 
    c, addr = s.accept() 

    req = c.recv(512) 

    print "%s has connected w REQ %s" %(str(addr), str(req)) 

    amount = len(os.listdir("./software")) 

    c.send(str(amount)) 
    print amount 

    for dir in os.listdir("./software"): 
     name = str(dir) 
     c.send() 
     with open("./software/"+dir+"/img.jpg", "rb") as image: 
      image.seek(0) 
      imageStr = image.read().encode("base64") 
      c.send(imageStr) 
      print "imageStr" 
     with open("./software/"+dir+"/text.txt", "r+") as desc: 
      desc.seek(0) 
      descStr = desc.read() 
      c.send(descStr) 
      print descStr 
    c.close() 
s.close() 

クライアント:

import socket 

class Connection(object): 
    def __init__(self, name, desc): 
     self.name = name 
     self.desc = desc 

objList = [] 

def fetcher(request): 

    host = "192.168.178.87" 
    port = 6934 

    s = socket.socket() 

    s.connect((host, port)) 

    s.send(request) 

    amount = int(s.recv(128)) 

    for i in range(0, amount): 
     name = s.recv(512) 
     content = s.recv(32768) 
     desc = s.recv(8192) 
     objList.append(Connection(name, desc)) 

def window(): 
    for i in objList: 
     print i.name 
     print i.desc 
    print "Window loop" 
def main(request): 
    fetcher(request) 
    window() 
main("greetings") 

コンソール出力(Iが変化しませんでしたコード内のもの) サーバー:

('192.168.178.87', 56752) has connected w REQ greetings 
1 
imageStr 
Hallo 
('192.168.178.87', 56754) has connected w REQ greetings 
1 
imageStr 
Hallo 
('192.168.178.87', 56756) has connected w REQ greetings 
1 
imageStr 
Hallo 
('192.168.178.87', 56757) has connected w REQ greetings 
1 
imageStr 
Hallo 
('192.168.178.87', 56758) has connected w REQ greetings 
1 
imageStr 
Hallo 
('192.168.178.87', 56759) has connected w REQ greetings 
1 
imageStr 
Hallo 
('192.168.178.87', 56761) has connected w REQ greetings 
1 
imageStr 
Hallo 
('192.168.178.87', 56762) has connected w REQ greetings 
1 
imageStr 
Hallo 
('192.168.178.87', 56763) has connected w REQ greetings 
1 
imageStr 
Hallo 
('192.168.178.87', 56764) has connected w REQ greetings 
1 
imageStr 
Hallo 
('192.168.178.87', 56765) has connected w REQ greetings 
1 
imageStr 
Hallo 
('192.168.178.87', 56766) has connected w REQ greetings 
1 
imageStr 
Hallo 
('192.168.178.87', 56767) has connected w REQ greetings 
1 
imageStr 
Hallo 
私は、Pythonの2.7、両方のスクリプトをWindows 7のProfessionalの64ビット版を使用しています(私はここにいる理由...)

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
oneQk12AQAAAAAAADYAAAAoAAAACgAAAAoAAAABABgAAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAJBzt 
JBztJBztJBztJBztJBztJBztJBztJBztJBztAAAkHO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0k 
HO0AACQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7QAAJBztJBztJBztJBztJBztJBztJBzt 
JBztJBztJBztAAAkHO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0AACQc7SQc7SQc7SQc7SQc 
7SQc7SQc7SQc7SQc7SQc7QAAJBztJBztJBztJBztJBztJBztJBztJBztJBztJBztAAAkHO0kHO0k 
HO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0AACQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7QAA 
JBztJBztJBztJBztJBztJBztJBztJBztJBztJBztAAA= 


Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 

Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
oneQk12AQAAAAAAADYAAAAoAAAACgAAAAoAAAABABgAAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAJBzt 
JBztJBztJBztJBztJBztJBztJBztJBztJBztAAAkHO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0k 
HO0AACQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7QAAJBztJBztJBztJBztJBztJBztJBzt 
JBztJBztJBztAAAkHO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0AACQc7SQc7SQc7SQc7SQc 
7SQc7SQc7SQc7SQc7SQc7QAAJBztJBztJBztJBztJBztJBztJBztJBztJBztJBztAAAkHO0kHO0k 
HO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0AACQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7QAA 
JBztJBztJBztJBztJBztJBztJBztJBztJBztJBztAAA= 


Window loop 

C:\Users\LeEmpollon\Desktop\Cream>python cream.py 
one 
Hallo 
Window loop 

。コンソール出力(Iは、コードには何も変更していない) クライアントに同じコンピュータ上で実行され、スクリプトとフォルダが同じディレクトリにあるされた:読書のための

folder 
-software 
--one 
---img.jpg (10x10px) 
---text.txt(contains the word "Hello") 
--creamserver.py 
--cream.py 

感謝:)

+0

ここで、あなたのマジックナンバーは 'name = s.recv(512)content = s.recv(32768)desc = s.recv(8192)'から取得していますか? – corn3lius

+1

別々の 'send'呼び出しでたくさんのデータを送信し、別々の' recv'呼び出しで個別に読み取ろうとしているようですが、それはうまくいきません。 'recv'の前に2回の' send'が起こった場合、次の 'recv'は両方からデータを取得します。 [socket programming howto](https://docs.python.org/2/howto/sockets.html#using-a-socket)を参照してください。これが、人々が通常、ソケットで直接作業するのではなく、何らかのネットワークプロトコルを使用する理由の1つです。それは、お尻の痛みです。 – BrenBarn

+0

@ corn3lius私はちょうど私がそれらを使用しようとしているもののために十分大きなように見えたいくつかの数字を使用しました。 –

答えて

2

私はあなたがどのようにソケットの仕事を誤解していると思います。ソケットは、単一のsendの一部として送信されるか、または単一のrecvで受信される、あらゆる種類のデータの「チャンク」を追跡しません。ソケットはパイプのようなもので、一方の端にデータを入れ、もう一方の端にデータを引き出します。

nameimageStr、およびdescを送信する場合は、3つすべてを1つの大きなブロブにまとめて送信する場合と同じです。もう一方の側では、お客様のクライアントコードではnameがどこで終了し、imageStrがどこから始まるかを知る方法がありません。

動作の断続的な性質は、クライアントとサーバーの独立した操作が予測できないタイミングが原因です。クライアントがrecvを実行する前にサーバーがnameimageStrの両方を送信すると、クライアントは両方を同時に受信します。クライアントが2つのデータを送信する間にrecvを実行すると、recvはその時点までに送信されたものだけを受信します。あなたの場合は、前者が2回起こったように見え、後者は一度起こったようです。

これらの問題は、お読みくださいSocket Programming HOWTOで説明されています。特にこの部分:あなたはその少し考えてみれば

は今、あなたは、ソケットの基本的な真実を実現するために来る:メッセージは長さ(不潔)、または区切り(肩をすくめる固定しなければならないのいずれか)、またはは、どれくらいの時間が(はるかに良い)か、またはの終了を示し、接続をシャットダウンするととなります。

あなたのメッセージはこれらのことを何もしないので、確実にソケットを使用することはできません。

ソケットはあなたのために何もしません。どのような方法でもデータの区切り、チャンク、グループ化、または構造化は行いません。それはちょうど反対側にバイトを押します。別々のデータを送信して別々の断片として取り戻すなどの作業を行う場合は、すべてを自分で処理する必要があります(文書で提案されているようにデータの区切りまたは長さをマーキングする)。あるいは、ソケットで直接作業するのではなく、何らかの高レベルのネットワークプロトコルを使用してください。なぜなら、これらの制限のために、ソケットで直接作業することは、しばしばバットの痛みです。

関連する問題