摘自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("")