2015-03-03 2 views
0

Я использовал python 3 для написания сервера forking, который будет принимать множество клиентов (я не установил предел количества клиентов). Каждому клиенту будет присвоено значение индекса на сервере в порядке их соединения с сервером. например, 1-й клиент будет называться КЛИЕНТОМ 1, затем вторым является КЛИЕНТ 2 и т. д.forking server in python

Но проблема в том, что этот индекс не назначается клиентам правильно. Пожалуйста, помогите мне за это. Я посылаю код питона для сервера и клиента, а также образцов продукции

Для сервера код

import os, socket 

host="127.0.0.1" 
port=7000 
s=socket.socket() 
s.bind((host, port)) 
s.listen(10) 

def handle_client(s, addr, i): 
    while True: 
     data=s.recv(1024) 
     decoded_data=data.decode("utf-8") 
     if not decoded_data: 
       print("\nconnection with client " + str(i) + " broken\n") 
       break 
     print(" CLIENT " + str(i) + " -> " + decoded_data) 

def server(): 
    i=1 
    while i<=10: 
     c, addr=s.accept() 
     child_pid=os.fork() 
     if child_pid==0: 
       print("\nconnection successful with client " + str(i) + str(addr) + "\n") 
       handle_client(c, addr, i) 
     else: 
       i+=1 

server() 

Для клиента код

import socket 

def client(): 
    host="127.0.0.1" 
    port=7000 
    s=socket.socket() 
    s.connect((host, port)) 
    msg=str(input("\n -> ")) 
    encoded_msg=bytes(msg, "utf-8") 
    while msg!='q': 
      s.send(encoded_msg) 
      msg=str(input("\n -> ")) 
      encoded_msg=bytes(msg, "utf-8") 

client() 

Теперь я открываю 2 терминала и запустите сервер в одном и в другом терминале. Я запускаю клиентов один за другим.

Терминал, в котором я запускаю клиентов, выглядит следующим образом:

[email protected]:~/Documents/programs/python/network$ python3 forking_chat_client.py 

-> hii 

-> q 
[email protected]:~/Documents/programs/python/network$ python3 forking_chat_client.py 

-> hello 

-> q 
[email protected]:~/Documents/programs/python/network$ python3 forking_chat_client.py 

-> hii how are you??? 

-> q 
[email protected]:~/Documents/programs/python/network$ python3 forking_chat_client.py 

-> good day 

-> q 
[email protected]:~/Documents/programs/python/network$ 

терминал, в котором сервер работает, как это

[email protected]:~/Documents/programs/python/network$ python3 forking_chat_server.py 

connection successful with client 1('127.0.0.1', 50362) 

    CLIENT 1 -> hii 

connection with client 1 broken 


connection successful with client 2('127.0.0.1', 50363) 

    CLIENT 2 -> hello 

connection with client 2 broken 


connection successful with client 1('127.0.0.1', 50364) 

    CLIENT 1 -> hii how are you??? 

connection with client 1 broken 


connection successful with client 3('127.0.0.1', 50365) 

    CLIENT 3 -> good day 

connection with client 3 broken 

Как вы можете видеть в терминале сервера индекс 1 присваивается двум клиентам-1 и один 3-один. Как это произошло? Какая ошибка в моем коде? Пожалуйста, помогите мне

ответ

0

Проблема в том, что ваши разветвленные процессы продолжают работать с циклом сервера после обработки клиента. Попробуйте добавить break после вызова handle_client(c, addr, i):

def server(): 
    i=1 
    while i<=10: 
     c, addr=s.accept() 
     child_pid=os.fork() 
     if child_pid==0: 
       print("\nconnection successful with client " + str(i) + str(addr) + "\n") 
       handle_client(c, addr, i) 
       break         # fix here! 
     else: 
       i+=1 
+0

спасибо сэр –