TCP-сервер Python отправляет данные нескольким клиентам

у меня возникли проблемы с попыткой отправить данные всем клиентам, подключенным к моему серверу чата tcp python. Я знаю, как отправить сообщение/данные обратно тому, кто его отправил, но оно просто не будет отправлено обратно, если у меня несколько клиентов. это мой сервер до сих пор:

host = '127.0.0.1'
port = 4446
backlog = 5
size = 1024

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind( (host, port) )
s.listen(backlog)
clients = [s]

while 1:
  inputReady, outputReady, exceptReady = select.select(clients, [], [])
  for x in inputReady: 

    if x == s: 
        csock, addr = s.accept() 
        clients.append(csock) 

    else:  
        data = x.recv(size) 
        if data: 
            for i in clients: #problem i believe is in here but i
                i.send(data)  #dont know how to fix it
        else: 
            x.close() 
            clients.remove(x) 
s.close()

я использую node.js для клиентской стороны, и пока это очень просто, и я не думаю, что это проблема:

var net = require('net');
var readline = require('readline');

var host = process.argv[2];
var port = process.argv[3];
var username = process.argv[4];
var client = new net.Socket();

client.connect(port, host, function(){
    var type = "connect";
    var sender = username;
    var msg = "has connected";
    var s = type + ':' + sender + ':' + msg;
    var length = s.length;
    client.write(length + " " + s);
});

client.on('data', function(data){
    console.log(data.toString('UTF-8'));
});

person CRS    schedule 11.02.2014    source источник
comment
В вашем коде отправки есть ошибка, которую вы не заметили. Вы забыли проверить возвращаемое значение send. Прочтите документацию по этому методу, чтобы узнать, почему это необходимо. Вы также используете блокирующие сокеты, что означает, что ваш сервер может обрабатывать данные только настолько быстро, насколько их может обрабатывать самый медленный клиент. Вы можете заглянуть на twistedmatrix.com, чтобы узнать о более простом подходе к сетевому программированию на Python (это похоже на Node. js для Python!)   -  person Jean-Paul Calderone    schedule 11.02.2014


Ответы (1)


Проблема в том, что вы отправляете на все сокеты, включая сокет(ы) сервера. Игнорируя другие потенциальные проблемы, вы можете быстро исправить это, выполнив следующие действия:

       for i in clients:
          if i is not s:
            i.send(data)
person epx    schedule 11.02.2014