2016-08-12 59 views
0

我有一个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特定客户,说出去的客户A,B和C,其发送到B.在这种情况下,如何识别线程并调用该函数?

+0

您也可以从单线程聊天服务器获得一些想法:http://www.binarytides.com/code-chat-application-server-client-sockets-python/ – ErikR

回答

1

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

基本轮廓:

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

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

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

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