#多人聊天室
"""
chat room
客戶端功能: 傳送請求, 獲取結果
"""from socket import *
from multiprocessing import process
import sys
# 伺服器位址
addr = ('127.0.0.1',8888)
# 接收訊息
def recv_msg(s):
while true:
data,addr = s.recvfrom(4096)
print(data.decode() + "\n發言:",end="") # 列印接收內容
# 傳送訊息
def send_msg(s,name):
while true:
try:
# 對異常退出的處理
text = input("發言:")
except keyboardinterrupt:
text = 'quit'
if text == 'quit':
# 退出訊息
msg = "q " + name
s.sendto(msg.encode(),addr) # 告知服務端
sys.exit("退出聊天室") # 程序結束
msg = "c %s %s"%(name,text)
s.sendto(msg.encode(),addr)
# 網路結構
def main():
s = socket(af_inet,sock_dgram)
# 進入聊天室
while true:
name = input("請輸入姓名:")
msg = "l "+name # 根據協議,組織訊息格式
s.sendto(msg.encode(),addr) # 將姓名傳送給服務端
data,addr = s.recvfrom(128) # 接收反饋
if data.decode() == 'ok':
print("您已進入聊天室")
break
else:
print(data.decode())
# 建立乙個新的程序
p = process(target = recv_msg,args=(s,)) # 子程序接收訊息
p.daemon = true # 子程序隨父程序退出
p.start()
# 傳送訊息
send_msg(s,name) # 傳送訊息由父程序執行
if __name__ == '__main__':
main()
"""chat room
env: python3.6
socket udp and process
"""from socket import *
from multiprocessing import process
# 伺服器位址
host = "0.0.0.0"
port = 8888
addr = (host,port)
# 使用者資訊儲存
user = {}
# 處理進入聊天室
def do_login(s,name,address):
if name in user or "管理" in name:
s.sendto("該用名已經存在".encode(),address)
return
else:
s.sendto(b'ok', address)
# 告知其他人
msg = "\n歡迎 %s 進入聊天室" % name
for i in user:
s.sendto(msg.encode(),user[i])
user[name] = address # 字典中增加一項
# 處理聊天
def do_chat(s,name,text):
msg = "\n%s : %s"%(name,text)
for i in user:
# 出去本人
if i != name:
s.sendto(msg.encode(),user[i])
# 處理退出
def do_quit(s,name):
del user[name] # 刪除使用者
msg = "\n%s 退出聊天室"%name
for i in user:
s.sendto(msg.encode(),user[i])
# 接收各個客戶端請求
def request(s):
"""總分模式
1. 接收不同的客戶端請求型別
2. 分情況討論
3. 不同的情況呼叫 不同的封裝方法
4. 每個封裝功能設計參考 學的函式或者類的設計過程
"""while true:
data,addr = s.recvfrom(1024) # 接收請求
tmp = data.decode().split(' ',2) # 對請求解析
if tmp[0] == 'l':
# 處理進入聊天室 tmp --> ['l', 'name']
do_login(s,tmp[1],addr)
elif tmp[0] == 'c':
# 處理聊天 tmp --> [c , name,***x]
do_chat(s,tmp[1],tmp[2])
elif tmp[0] == 'q':
# 處理退出 tmp --> [q, name]
do_quit(s,tmp[1])
# 傳送管理員訊息
def manager(s):
while true:
msg = input("管理員訊息:")
msg = "c 管理員 "+ msg
s.sendto(msg.encode(), addr) # 從父程序將訊息傳送給子程序
# 搭建基本結構
def main():
# 建立乙個udp套接字
s = socket(af_inet,sock_dgram)
s.bind(addr)
# 建立新的程序用於給客戶端傳送管理員訊息
p = process(target = request,args=(s,))
p.start()
manager(s) # 處理發來的請求
p.join()
if __name__ == '__main__':
main()
Linux C 多人網路聊天室 UDP
任何直接甩 的都是耍流氓!connectsocket 函式在socket.c中實現 sclient connectsocket serverip,serverport,udp if sclient 1 使用者註冊,直到註冊成功 無返回值 void userregister int socketfd ...
Python簡單多人聊天室
伺服器端 auther kele 匯入socket包 import socket,threading 建立乙個socket物件 server socket.socket socket.af inet,socket.sock stream 獲取本地ip host socket.gethostname ...
簡單的多人聊天室
1.安裝nodejs websocket 和 socket.io npm install nodejs websocket socket.io 2.html 中引入socket.io.js檔案 在html中 通過 socket io ws localhost 3000 開啟socket連線,通過so...