UDP多人聊天室

2021-10-05 02:00:16 字數 3331 閱讀 6253

#多人聊天室

"""

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...