2016-12-22 4 views
-1

Hallo stackoverflow Gemeinschaft, Ich schrieb ein einfaches Socket-basierte Python-Skript und führte es ~ 20 mal. 18 mal tat es, was es tun sollte, aber 2 mal druckte es einige randome Letters.das gleiche Python-Skript, aber andere Ergebnisse

(Es sollte jeden folder in einem bestimmten Verzeichnis senden und drucken)

Server:

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() 

Auftraggeber:

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") 

Die Konsolenausgabe (ich habe nicht ändern alles im Code) Server:

('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 

Die Konsolenausgabe (Ich habe nichts in dem Code ändern) Kunde: (Der Grund, warum ich hier bin ...)

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 

ich Windows 7 Professional 64-bit verwenden, Python 2.7, beide Skripte wurden auf demselben Computer ausgeführt werden, und die Skripte und Ordner im selben Verzeichnis befinden:

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

Danke fürs Lesen :)

+0

Woher bekommst du deine magischen Zahlen von 'name = s.recv (512) content = s.recv (32768) desc = s.recv (8192)'? – corn3lius

+1

Es sieht so aus, als würden Sie gerade eine Reihe von Daten mit separaten 'send'-Anrufen senden und versuchen, sie separat mit separaten' recv'-Anrufen zu lesen, aber das wird nicht funktionieren. Wenn zwei 'send's vor einem' recv' vorkommen, wird das nächste 'recv' die Daten von beiden erhalten. Weitere Informationen finden Sie in der [Socket-Programmierhilfe] (https://docs.python.org/2/howto/sockets.html#using-a-socket). Das ist ein Grund, warum Leute normalerweise irgendeine Art von Netzwerkprotokoll verwenden, anstatt direkt mit den Sockeln zu arbeiten. Es ist ein Schmerz im Hintern. – BrenBarn

+0

@ corn3lius Ich habe nur ein paar Nummern benutzt, die groß genug für die Dinge waren, für die ich sie benutzen werde. –

Antwort

2

ich glaube, du Missverständnis, wie Steckdosen Arbeit. Der Socket verfolgt keine Art von "Chunks" von Daten, die als Teil einer einzelnen send gesendet oder mit einer einzigen recv empfangen werden. Der Sockel ist wie eine Röhre, in die man Daten an einem Ende stopft und am anderen Ende herauszieht.

Wenn Sie name, imageStr und desc senden, ist das das Gleiche wie das Senden aller drei von ihnen zusammen in einem großen Blob. Auf der anderen Seite hat Ihr Client-Code keine Möglichkeit zu sagen, wo name endet und imageStr beginnt.

Das intermittierende Verhalten ist auf das unvorhersehbare Timing des unabhängigen Betriebs von Client und Server zurückzuführen. Wenn Ihr Server sowohl name als auch imageStr sendet, bevor der Client seine recv ausführt, wird der Client beide gleichzeitig erhalten. Wenn der Kunde zwischendurch einen recv zwischen den beiden Daten sendet, erhält der recv nur, was zu diesem Zeitpunkt gesendet wurde. In Ihrem Fall sieht es so aus, als ob Ersteres zweimal und Letzteres einmal passiert ist. Diese Probleme werden in der Socket Programming HOWTO erläutert, die Sie lesen sollten. Gerade dieser Teil:

Nun, wenn Sie denken, dass ein bisschen, dann kommen Sie eine grundlegende Wahrheit von Sockets zu erkennen: Nachrichten entweder festgelegt werden müssen Länge (igitt) oder begrenzt werden (Achselzucken) oder geben Sie an, wie lange sie sind (viel besser), oder Ende durch Herunterfahren der Verbindung.

Da Ihre Nachrichten keines dieser Dinge tun, können Sie den Socket nicht zuverlässig verwenden.

Die Steckdose macht nichts für Sie. Es grenzt Ihre Daten in keiner Weise ab, gruppiert oder gruppiert sie. Es schiebt nur Bytes zum anderen Ende. Wenn Sie z. B. separate Daten senden und diese dann als separate Teile erneut erfassen möchten, müssen Sie dies alles selbst erledigen (indem Sie Ihre Daten wie in den Dokumenten vorgeschlagen abgrenzen oder in der Länge markieren). Alternativ können Sie auch ein Netzwerkprotokoll höherer Ebene verwenden, anstatt direkt mit Sockets zu arbeiten, da die direkte Arbeit mit Sockets aufgrund dieser Einschränkungen oft ein Problem ist.

Verwandte Themen