2017-02-17 4 views
0

Я пытаюсь найти сумму двух чисел. Это мои коды для сервера и клиента, результат я хочу КЛИЕНТ ПОЛУЧИЛ: Sum 46 , но вместо этого я получаю КЛИЕНТ ПОЛУЧИЛ: Sum 12 КЛИЕНТ ПОЛУЧИЛ: Sum 34Не получить ответ в этой программе сокетов

Клиент:

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

Сервер:

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

и Foo содержит

12 
34 

ответ

0

Вы создаете список номеров из текстового файла, но только отправка (и, следовательно, суммируя) каждый номер один на один раз. Вы можете либо собрать сервер по каждому из номеров по одному, а , затем суммировать их или отправить все номера за один раз. Я бы рекомендовал последнее. Что-то вроде этого:

Client

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

Сервер

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

Это будет посылать номера на сервер вместе в виде одной строки, например 12,34. Затем сервер суммирует значения внутри одной строки.

+0

По-прежнему нет гарантии, что сервер получит все номера в одном вызове 'conn.recv()'. Даже если клиент только однажды называет 's.sendall()', он все равно может отображаться в нескольких '.recv()' s. –

+0

@ 101 Получение этого выхода для сделанного редактирования: КЛИЕНТ ПОЛУЧЕН: Сумма 12,34 ПОЛУЧЕН КЛИЕНТ: Сумма 12,34 – user7576454

+0

@ Robᵩ любая модификация, чтобы получить выход только один раз? – user7576454

Смежные вопросы