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.sendto(b"fail"
, addr)
return
else
:# 進入成功返回ok
s.sendto(b"ok"
, addr)
# 廣播訊息
msg =
"\n歡迎 %s 進入聊天室"
% name
for i in user:
s.sendto(msg.encode(
), user[i]
)# 記錄客戶端資訊
user[name]
= addr
# 處理聊天請求
deftransfer
(s, name, msg_content)
:# **訊息
msg =
"\n%s:%s"
%(name, msg_content)
for i in user:
if i != name:
s.sendto(msg.encode(
), user[i]
)# 處理退出請求
defquit
(s, name)
:# 廣播訊息
msg =
"\n%s 退出聊天室"
% name
for i in user:
if i != name:
s.sendto(msg.encode(
), user[i]
)else
:# 給客戶的「收」程序傳送退出訊號
s.sendto(b"exit"
, user[i]
)# 刪除客戶端資訊
del user[name]
# 處理管理員訊息
defmanager_message
(s):
while
true
: content =
input
(">>>"
) msg =
"chat 管理員訊息 %s"
% content
s.sendto(msg.encode(
), addr)
# 主函式
defmain()
:# 建立udp套接字
s = socket(af_inet, sock_dgram)
# 繫結服務端位址
s.bind(addr)
# 建立多程序
pid = os.fork(
)if pid <0:
print
("error"
)# 子程序,用於傳送管理員訊息
elif pid ==0:
manager_message(s)
# 父程序,用於處理客戶端請求
else
:while
true
:# data提前約定通訊協議
data, addr = s.recvfrom(
1024
)# 解析請求
tmp = data.decode(
).split(
" ",2)
# 連線請求
if tmp[0]
=="connect"
: login(s, tmp[1]
, addr)
# 聊天請求
elif tmp[0]
=="chat"
: transfer(s, tmp[1]
, tmp[2]
)# 退出請求
elif tmp[0]
=="quit"
: quit(s, tmp[1]
)if __name__ ==
"__main__"
: main(
)
from socket import
*import os, sys
# 記錄服務端位址
addr =
("127.0.0.1"
,8888
)# 主函式
defmain()
:# 建立udp套接字
s = socket(af_inet, sock_dgram)
while
true
: name =
input
("請輸入姓名:"
)# 根據通訊協議組織進入訊息
msg =
"connect %s"
% name
s.sendto(msg.encode(
), addr)
feedback, addr = s.recvfrom(
1024
)# 收到ok,進入聊天室成功
if feedback == b"ok"
:print
("您已進入聊天室"
)break
else
:# 收到fail,進入聊天室失敗
print
("該使用者已存在"
)# 建立多程序
pid = os.fork(
)if pid <0:
print
("error!"
)return
# 子程序,用於傳送訊息
elif pid ==0:
while
true
:# 捕獲客戶端退出並處理
try:
# 輸入quit也可退出
content =
input
(">>>"
)except
: content =
"quit"
if content ==
"quit"
:# 根據通訊協議組織退出訊息
msg =
"quit %s"
% name
s.sendto(msg.encode(
), addr)
sys.exit(
"您已退出群聊"
)else
:# 根據通訊協議組織聊天訊息
msg_send =
"chat %s %s"
%(name, content)
s.sendto(msg_send.encode(
), addr)
# 父程序,用於收訊息
else
:while
true
: data, addr = s.recvfrom(
1024
)# 如收到exit**,說明「發」程序已退出並傳遞了訊號到「收」程序
if data == b"exit"
: sys.exit(
)# 訊息展示
print
(data.decode()+
"\n>>>"
, end="")
if __name__ ==
"__main__"
: main(
)
Python簡單多人聊天室
伺服器端 auther kele 匯入socket包 import socket,threading 建立乙個socket物件 server socket.socket socket.af inet,socket.sock stream 獲取本地ip host socket.gethostname ...
UDP多人聊天室
多人聊天室 chat room 客戶端功能 傳送請求,獲取結果 from socket import from multiprocessing import process import sys 伺服器位址 addr 127.0.0.1 8888 接收訊息 def recv msg s while ...
簡單的多人聊天室
1.安裝nodejs websocket 和 socket.io npm install nodejs websocket socket.io 2.html 中引入socket.io.js檔案 在html中 通過 socket io ws localhost 3000 開啟socket連線,通過so...