2017-02-17 4 views
0

Ich versuche, die Summe der beiden Zahlen zu finden. Dies sind meine Codes für Server und Client, das Ergebnis, das ich will, ist Client empfangen: Sum 46 sondern ich bekomme Client empfangen: Sum 12 Client empfangen: Sum 34Nicht die Antwort in diesem Socket-Programm

Auftraggeber:

# Echo client program 

import socket 

def parse_file(fName): 
    list = [] 
    with open(fName) as f: 
     for line in 1f: 
      list.append(line.strip()) 
    return list 


HOST = 'localhost' # The remote host 
PORT = 50007    # The same port as used by the server 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((HOST, PORT)) 

# s.sendall('Hello, world') 
# data = s.recv(1024) 
# s.close() 
# print 'Received', repr(data) 

input_data = parse_file('foo') 

for i in input_data: 
    s.sendall(str(i)) 
    sum = s.recv(1024) 
    print "CLIENT RECEIVED : Sum ", sum 

s.close() 

Server:

import socket 

def compute_sum(line): 
    result = sum(int(i) for i in line) 
    return result 

HOST = 'localhost'     # Symbolic name meaning all available interfaces 
PORT = 50007    # Arbitrary non-privileged port 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((HOST, PORT)) 
s.listen(1) 
conn, addr = s.accept() 
print 'Connected by', addr 
while 1: 
    data = conn.recv(1024) 
    if not data: break 
    print "SERVER RECIEVED : ", repr(data) 
    compute_sum(data) 

    conn.sendall(data) 
conn.close() 

und die Foo enthalten

12 
34 

Antwort

0

Sie eine Liste von Zahlen aus der Textdatei erstellen, aber dann nur das Senden (und somit Summieren) jede Nummer eines nach dem anderen. Sie können entweder den Server jede der Zahlen einzeln sammeln lassen und dann summieren, oder senden Sie alle Zahlen auf einmal. Ich würde das letztere empfehlen. Etwas wie folgt aus:

Kunde

s.sendall(','.join(input_data)) 
sum = s.recv(1024) 

Server

def compute_sum(line): 
    return sum(int(i) for i in line.split(',')) 

, dass die Zahlen auf dem Server zusammen als eine einzige Zeichenfolge senden, z.B. 12,34. Der Server wird dann die Werte innerhalb dieser einzelnen Zeichenfolge summieren.

+0

Es gibt immer noch keine Garantie, dass der Server alle Nummern in einem einzigen Aufruf von 'conn.recv()' empfangen würde. Selbst wenn der Client nur 's.sendall()' einmal aufruft, kann er trotzdem in mehreren '.recv()' s erscheinen. –

+0

@ 101 diese Ausgabe für die Bearbeitung erhalten: KUNDE EMPFANGEN: Summe 12,34 KUNDE EMPFANGEN: Summe 12,34 – user7576454

+0

@ Robᵩ irgendeine Änderung, um die Ausgabe nur einmal zu bekommen? – user7576454

Verwandte Themen