2016-08-12 64 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值放在客戶端的輸出隊列中,最終輸出線程將自行關閉。