많은 클라이언트의 연결을 동시에 처리해야하는 다중 사용자 채팅 같은 프로젝트에서 작업하고 있습니다. 클라이언트가 연결되면 연결이 accept()
이되어 self.socket.recv(1024)
루프가있는 들어오는 데이터를 처리하는 자체 스레드에서 Client
클래스로 전달합니다. 데이터가 들어 오면 data-queue
이라는 목록에 저장됩니다. 그런 다음이 클라이언트를 Clients
의 목록에 저장합니다.연결을 수락 할 때 여러 개의 소켓이 만들어 지지만 데이터는 연결된 첫 번째 클라이언트가 보낸 것처럼 처리됩니다.
100ms마다 한 번, 내 Clients
목록에있는 모든 Client
을 반복하고 data-queue
목록이 비어 있는지 확인하십시오. 그렇지 않다면, 나는 pop()
-ing과 클라이언트 주소로 얻은 것을 인쇄합니다.
많은 클라이언트가 동시에 연결하면 첫 번째로 연결된 Client
만이 자신이 보낸 모든 데이터를받은 것처럼 보냅니다.
클라이언트 A가 "Hi!" 클라이언트 B가 "안녕하세요!"라고 말하면 서버는 클라이언트 A가 "안녕하세요!"라는 메시지를 보낸 것처럼 읽습니다. 및 "안녕하세요!" 클라이언트 B는 전체 시간 동안 침묵했다. 클라이언트 A의 연결이 끊어지면 추가 클라이언트의 모든 입력은 첫 번째로 남은 클라이언트 (이 경우에는 클라이언트 A가 남은 클라이언트 B)에 의해 보내진 것처럼 처리됩니다.
무엇이 될 수 있습니까?
편집 :
이소스 코드는 다음과 같이 다소 간다 :
CLIENTS = []
def main():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 1515))
s.listen(5)
runCycle()
while True:
CLIENTS.append(client(s.accept()))
CLIENTS[len(CLIENTS)-1].start()
class client(threading.Thread):
dataQueue = []
def __init__(self, (socket, address)):
self.socket = socket
self.address = address
threading.Thread.__init__(self)
def run(self):
self.data = ""
while True:
self.data = self.socket.recv(1024)
if not self.data:
break
dataQueue.append(self.address + " " + self.data)
self.data = ""
def runCycle():
threading.Timer(0.1, runCycle).start()
for c in CLIENTS:
if len(c.dataQueue) > 0:
print c.dataQueue.pop()
main()
정보가 너무 적 으면 고객의 코드를 게시 할 수 있습니까? –
있습니다! 감사합니다 ~ – Maralis