2014-02-11 1 views
1

python tcp chat 서버에 연결된 모든 클라이언트에 데이터를 보내는데 문제가 있습니다. 나는 메시지/데이터를 보내는 사람에게 바로 보내도록하는 방법을 알고 있지만 여러 클라이언트가있는 경우에는 다시 보내지 않을 것입니다. 이것은 지금까지 내 서버입니다 : 내가 지금까지 클라이언트 측과 매우 간단한을위한 Node.js를 사용하고python tcp 서버가 여러 클라이언트에 데이터를 전송하는 중

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

와 나는 그 문제를 생각 해달라고 :

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')); 
}); 
+0

알려지지 않은 송신 코드에 버그가 있습니다. 'send'의 반환 값을 확인하는 것을 잊었습니다. 그 방법에 대한 문서를 읽고 왜 이것이 필요한지 알아보십시오. 블로킹 소켓을 사용하기 때문에 서버가 가장 느린 클라이언트가 처리 할 수있는 속도로 데이터를 처리 할 수 ​​있습니다. http://twistedmatrix.com/에서 파이썬의 네트워크 프로그래밍에보다 쉽게 ​​접근 할 수 있습니다 (파이썬의 경우 Node.js와 비슷합니다). –

답변

2

문제는 당신이다 서버 소켓을 포함한 모든 소켓에서 보내고 있습니다. 다른 잠재적 인 문제는 무시하고 다음을 수행하여 빠른 수정을 할 수 있습니다.

 for i in clients: 
      if i is not s: 
      i.send(data)