Python 之socket多線程


一、服務端

import socket
from threading import Thread
import socketserver

g_socket = None
g_conn_pool = []

def handle_client():
    while True:
        client, addr = g_socket.accept()
        print(addr)
        g_conn_pool.append(client)
        t = Thread(target=message_handle, args=(client,))
        t.setDaemon(True)
        t.start()

def message_handle(client):
        while True:
            data = client.recv(1024).decode('utf-8')
            print(data)
            if data == 'exit':
                g_conn_pool.remove(client)
                client.send(data.encode('utf-8'))
                print('下線了')
                break
            client.send(data.encode('utf-8'))

def main():
    global g_socket, g_conn_pool
    g_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    g_socket.bind(('127.0.0.1', 12306))
    g_socket.listen(5)
    print("服務端已啟動,等待客戶端連接...")

    t = Thread(target=handle_client)
    t.setDaemon(True)
    t.start()
    while True:
        cmd = input("請輸入操作:")
        if cmd == '':
            continue
        if int(cmd) == 1:
            print("--------------------------")
            print("當前在線人數:", len(g_conn_pool))
        if cmd == 'exit':
            exit()

if __name__ == '__main__':
    main()

 

二、客戶端

import socket
import time
import queue
from threading import Thread

q = queue.Queue()

def recv_message(s):
    while True:
        data = s.recv(1024).decode('utf-8').strip()
        print(data)
        if data == 'exit':
            q.put(1)
            break
        send_message(s)
    s.close()
    
def send_message(s):
    data = input('input:')
    s.send(data.encode('utf-8'))

def main():
    s = socket.create_connection(('127.0.0.1', 12306))
    s.send('連接服務器'.encode('utf-8'))
    
    Thread(target=recv_message, args=(s,)).start()
    time.sleep(1)
    while q.empty():
        pass
            
    
if __name__ == '__main__':
    main()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM