在Python中识别线程

时间:2016-08-12 07:34:26

标签: python multithreading sockets server client-server

我运行了一个python Socket服务器,还有套接字客户端。

现在,例如说有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,比如客户端A,B和C,请将它发送给B.在这种情况下,如何识别线程并调用该函数?

1 个答案:

答案 0 :(得分:1)

您可以使用每个连接的队列和多个线程来解决此问题。

基本概要:

  1. 每个客户端连接产生两个线程 - 一个用于监视客户端输入,另一个用于监视队列。放在队列中的项目将被发送到客户端。每个客户端连接都有自己的输出队列。

  2. 您还需要一个全局字典来将客户端名称映射到其输出队列。

  3. 要向特定客户端发送消息,请找到客户端的输出队列并将消息添加到该客户端。

  4. 您还需要一种方法来关闭客户端的输出线程。一种常见的方法是在队列上使用 sentinel 值(如None)来通知输出线程退出其处理循环。当客户端的输入线程检测到EOF时,它可以将sentinel值放在客户端的输出队列上,最终输出线程将自行关闭。