zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    分享一份Java架构师学习资料,2019年最新整理!
    Spring Boot 最核心的 25 个注解,都是干货!
    推荐一款接口 API 设计神器!
    题库
    杂乱的知识点
    mysql查询疯狂41例
    mysql你问我答
    可能出现的面试题
    SQLALchemy
    基于蓝图的完整的Flask项目
  • 原文地址:https://www.cnblogs.com/yang-2018/p/12720506.html
Copyright © 2011-2022 走看看