2016-08-12 5 views
0

У меня есть сервер Socket python, а также клиенты сокетов.Идентифицировать поток в Python

Теперь, скажем, есть 3 клиента, подключенные к одному серверу. Ниже вы найдете код сервера.

#!/usr/bin/python   # This is server.py file 

import socket    # Import socket module 
import threading 

serversocket = socket.socket()   # Create a socket object 
host = socket.gethostname() # Get local machine name 
port = 1234    # Reserve a port for your service. 
serversocket.bind((host, port))  # Bind to the port 
serversocket.listen(5) 
print("Bound the port ",port,"on Machine : ",host,", and ready to accept connections.\n") 

def clientThread(connection): 
    while True: 
     data=connection.recv(1024) 
     if not data: 
      break 
     connection.send("Thanks") 

    connection.close() 

def sendMessage(connection, message): 
    connection.send(message) 

while 1: 
    connection, address = serversocket.accept() 
    start_new_thread(clientthread, (connection,)) 

serversocket.close(); 

Теперь мне нужно вызвать SendMessage для конкретного клиента, скажем, из клиентов А, В и С, отправить его в B. В этом случае, как я определяю нить и вызвать эту функцию?

+0

Вы также можете получить некоторые идеи с одного сервера чата: http://www.binarytides.com/code-chat-application-server-client-sockets-python/ – ErikR

ответ

1

Для решения этой проблемы вы можете использовать очереди и несколько потоков для каждого соединения.

Основной контур:

  1. Каждое соединение клиента нерестится два потока - один для контроля входа клиента и другой, который отслеживает очередь. Элементы, помещенные в очередь, будут отправлены клиенту. Каждое клиентское соединение будет иметь свою собственную очередь вывода.

  2. Вам также понадобится глобальный словарь для сопоставления имени клиента с их выходной очередью.

  3. Чтобы отправить сообщение конкретному клиенту, найдите выходную очередь клиента и добавьте к нему сообщение.

  4. Вам также понадобится способ отключения выходного потока для клиента. Общим подходом является использование в очереди отправителя (например, None) для информирования выходного потока о выходе из цикла обработки. Когда входной поток клиента обнаруживает EOF, он может поместить значение часового в очередь вывода клиента, и в конечном итоге выходной поток закроется.