網絡編程_簡單的多連接服務端

摘自https://blog.csdn.net/qq_39687901/article/details/100068450?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-1
代碼爲python3代碼

import socket  # 導入 socket 模塊
from threading import Thread
 
ADDRESS = ('127.0.0.1', 8712)  # 綁定地址
g_socket_server = None  # 負責監聽的socket
g_conn_pool = []  # 連接池
 
 
def init():
    """
    初始化服務端
    """
    global g_socket_server
    g_socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 創建 socket 對象
    g_socket_server.bind(ADDRESS)
    g_socket_server.listen(5)  # 最大等待數(有很多人理解爲最大連接數,其實是錯誤的)
    print("服務端已啓動,等待客戶端連接...")
 
 
def accept_client():
    """
    接收新連接
    """
    while True:
        client, _ = g_socket_server.accept()  # 阻塞,等待客戶端連接
        # 加入連接池
        g_conn_pool.append(client)
        # 給每個客戶端創建一個獨立的線程進行管理
        thread = Thread(target=message_handle, args=(client,))
        # 設置成守護線程
        thread.setDaemon(True)
        thread.start()
 
 
def message_handle(client):
    """
    消息處理
    """
    client.sendall("連接服務器成功!".encode(encoding='utf8'))
    while True:
        bytes = client.recv(1024)
        print("客戶端消息:", bytes.decode(encoding='utf8'))
        if len(bytes) == 0:
            client.close()
            # 刪除連接
            g_conn_pool.remove(client)
            print("有一個客戶端下線了。")
            break
 
 
if __name__ == '__main__':
    init()
    # 新開一個線程,用於接收新連接
    thread = Thread(target=accept_client)
    thread.setDaemon(True)
    thread.start()
    # 主線程邏輯
    while True:
        cmd = input("""--------------------------
輸入1:查看當前在線人數
輸入2:給指定客戶端發送消息
輸入3:關閉服務端
""")
        if cmd == '1':
            print("--------------------------")
            print("當前在線人數:", len(g_conn_pool))
        elif cmd == '2':
            print("--------------------------")
            index, msg = input("請輸入“索引,消息”的形式:").split(",")
            g_conn_pool[int(index)].sendall(msg.encode(encoding='utf8'))
        elif cmd == '3':
            exit()

client

import socket
 
s = socket.socket()
s.connect(('127.0.0.1', 8712))
print(s.recv(1024).decode(encoding='utf8'))
s.send("連接了".encode('utf8'))
print(s.recv(1024).decode(encoding='utf8'))
input("")

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章