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()

 

posted @ 2020-04-17 15:56  样子2018  阅读(5003)  评论(0编辑  收藏  举报