# ------------------------------伺服器端-----------------------------------------
# auther: kele
# 匯入socket包
import socket, threading
# 建立乙個socket物件
server = socket.socket(socket.af_inet, socket.sock_stream)
# 獲取本地ip
host = socket.gethostname()
# 給定埠
port = 9090
# 給伺服器ip和埠
server.bind((host, port))
# 最大連線數
server.listen(5)
print('輸入enter退出伺服器')
# 建立乙個客戶端列表
clients = list()
# 存放已經建立執行緒的客戶端
end = list()
# 阻塞式等待客戶端連線,返回連線物件,與間接物件位址
def accept():
while true:
client, addr = server.accept()
print("\r"+'-'*5+f'伺服器被連線: 當前連線數:-----'+'-'*5, end='')
def recv_data(client):
while true:
# 接受來自客戶端的資訊
try:
indata = client.recv(1024)
except exception as e:
clients.remove(client)
end.remove(client)
print("\r" + '-' * 5 + f'伺服器被斷開: 當前連線數:-----' + '-' * 5, end='')
break
print(indata.decode('utf-8'))
for clien in clients:
# **來自客戶端的資訊,發給其他客戶端
if clien != client:
clien.send(indata)
def outdatas():
while true:
# 輸入要給客戶端的資訊
print('')
outdata = input('')
print()
if outdata=='enter':
break
print('傳送給所有人:%s'% outdata)
# 給每個客戶端發資訊
for client in clients:
client.send(f"伺服器:".encode('utf-8)'))
def indatas():
while true:
# 迴圈出連線的客戶端,並建立相應執行緒
for clien in clients:
# 若是執行緒已經存在則跳過
if clien in end:
continue
index = threading.thread(target = recv_data,args = (clien,))
index.start()
# 建立多執行緒
# 建立接受資訊,執行緒物件
t1 = threading.thread(target = indatas,name = 'input')
t1.start()
# 建立傳送資訊,執行緒物件
t2 = threading.thread(target = outdatas, name= 'out')
t2.start()
# 等待客戶連線,執行緒物件
t3 = threading.thread(target = accept(),name = 'accept')
t3.start()
# 堵塞縣城知道子執行緒執行完畢,主線程才能結束
# t1.join()
t2.join()
# 關閉每乙個伺服器
for client in clients:
client.close()
print('-'*5+'伺服器斷開連線'+'-'*5)
# -----------------------------------客戶端--------------------------------------------
# -*- coding: utf-8 -*-
# auther: kele
# 匯入socket包
import socket, threading
# 建立客戶端物件
client = socket.socket(socket.af_inet, socket.sock_stream)
# 目標主機
host = input('輸入目標ip')
while true:
name = input('請輸入個人暱稱, 不得超過十個字元,少於乙個字元')
if 1break
# 目標埠
port = 9090
# 連線客戶端
client.connect((host, port))
print('-'*5+'已連線到伺服器'+'-'*5)
print('-'*5+'輸入enter關閉與伺服器的連線'+'-'*5)
def outdatas():
while true:
# 輸入要發給伺服器的資訊
outdata = input('')
print()
if outdata=='enter':
break
# 傳送給伺服器
client.send(f':'.encode('utf-8'))
print('%s:%s'% (name, outdata))
def indatas():
while true:
# 接受來自伺服器的資訊
indata = client.recv(1024)
# 將接受到的資訊,進行編碼
print(indata.decode('utf-8'))
# 建立多執行緒
# 建立接受資訊,執行緒物件
t1 = threading.thread(target=indatas, name='input')
# 建立輸出資訊,執行緒物件
t2 = threading.thread(target=outdatas, name='out')
# 啟動多執行緒
t1.start()
t2.start()
# 阻塞執行緒,直到子執行緒執行結束,主線程才能結束。
# t1.join()
t2.join()
# 關閉連線
print('-'*5+'伺服器斷開連線'+'-'*5)
client.close()
簡單的多人聊天室
1.安裝nodejs websocket 和 socket.io npm install nodejs websocket socket.io 2.html 中引入socket.io.js檔案 在html中 通過 socket io ws localhost 3000 開啟socket連線,通過so...
UDP多人聊天室
多人聊天室 chat room 客戶端功能 傳送請求,獲取結果 from socket import from multiprocessing import process import sys 伺服器位址 addr 127.0.0.1 8888 接收訊息 def recv msg s while ...
Python 模擬多人聊天室
from socket import import os 繫結服務端位址 addr 127.0.0.1 8888 臨時儲存使用者資訊 user 登入請求處理 deflogin s,name,addr 判斷是否同名 if name in user or 管理 in name 進入失敗返回fail s....